Fixed #30324 -- Forced utf-8 encoding when loading the template for the technical 500 debug page.

Regression in 50b8493.
Related to ea542a9.
This commit is contained in:
Nick Pope 2019-04-05 14:38:35 +02:00 committed by Carlton Gibson
parent 9012033138
commit efb257a017
3 changed files with 22 additions and 3 deletions

View File

@ -328,14 +328,14 @@ class ExceptionReporter:
def get_traceback_html(self): def get_traceback_html(self):
"""Return HTML version of debug 500 HTTP error page.""" """Return HTML version of debug 500 HTTP error page."""
with Path(CURRENT_DIR, 'templates', 'technical_500.html').open() as fh: with Path(CURRENT_DIR, 'templates', 'technical_500.html').open(encoding='utf-8') as fh:
t = DEBUG_ENGINE.from_string(fh.read()) t = DEBUG_ENGINE.from_string(fh.read())
c = Context(self.get_traceback_data(), use_l10n=False) c = Context(self.get_traceback_data(), use_l10n=False)
return t.render(c) return t.render(c)
def get_traceback_text(self): def get_traceback_text(self):
"""Return plain text version of debug 500 HTTP error page.""" """Return plain text version of debug 500 HTTP error page."""
with Path(CURRENT_DIR, 'templates', 'technical_500.txt').open() as fh: with Path(CURRENT_DIR, 'templates', 'technical_500.txt').open(encoding='utf-8') as fh:
t = DEBUG_ENGINE.from_string(fh.read()) t = DEBUG_ENGINE.from_string(fh.read())
c = Context(self.get_traceback_data(), autoescape=False, use_l10n=False) c = Context(self.get_traceback_data(), autoescape=False, use_l10n=False)
return t.render(c) return t.render(c)

View File

@ -14,3 +14,6 @@ Bugfixes
(:ticket:`30307`). (:ticket:`30307`).
* Added compatibility for ``psycopg2`` 2.8 (:ticket:`30331`). * Added compatibility for ``psycopg2`` 2.8 (:ticket:`30331`).
* Fixed a regression in Django 2.2 that caused a crash when loading the
template for the technical 500 debug page (:ticket:`30324`).

View File

@ -7,6 +7,7 @@ import tempfile
import threading import threading
from io import StringIO from io import StringIO
from pathlib import Path from pathlib import Path
from unittest import mock
from django.core import mail from django.core import mail
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
@ -20,7 +21,8 @@ from django.utils.functional import SimpleLazyObject
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.views.debug import ( from django.views.debug import (
CLEANSED_SUBSTITUTE, CallableSettingWrapper, ExceptionReporter, CLEANSED_SUBSTITUTE, CallableSettingWrapper, ExceptionReporter,
cleanse_setting, technical_500_response, Path as DebugPath, cleanse_setting, default_urlconf,
technical_404_response, technical_500_response,
) )
from ..views import ( from ..views import (
@ -648,6 +650,20 @@ class ExceptionReporterTests(SimpleTestCase):
text = reporter.get_traceback_text() text = reporter.get_traceback_text()
self.assertIn('USER: [unable to retrieve the current user]', text) self.assertIn('USER: [unable to retrieve the current user]', text)
def test_template_encoding(self):
"""
The templates are loaded directly, not via a template loader, and
should be opened as utf-8 charset as is the default specified on
template engines.
"""
reporter = ExceptionReporter(None, None, None, None)
with mock.patch.object(DebugPath, 'open') as m:
reporter.get_traceback_html()
m.assert_called_once_with(encoding='utf-8')
m.reset_mock()
reporter.get_traceback_text()
m.assert_called_once_with(encoding='utf-8')
class PlainTextReportTests(SimpleTestCase): class PlainTextReportTests(SimpleTestCase):
rf = RequestFactory() rf = RequestFactory()