1
0
mirror of https://github.com/django/django.git synced 2025-06-05 03:29:12 +00:00

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

Regression in 50b8493.
Related to ea542a9.

Backport of efb257a01764855a71051d5bcc7fd66c5ad6d210 from master
This commit is contained in:
Nick Pope 2019-04-05 14:38:35 +02:00 committed by Carlton Gibson
parent 54b65b83a2
commit 9da25fb832
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

@ -6,6 +6,7 @@ import sys
import tempfile import tempfile
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.safestring import mark_safe
from django.utils.version import PY36 from django.utils.version import PY36
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 (
@ -610,6 +612,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()