summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Pope <nick.pope@flightdataservices.com>2019-04-05 14:38:35 +0200
committerCarlton Gibson <carlton.gibson@noumenal.es>2019-04-05 16:37:22 +0200
commit9da25fb832ae9db1a26f3796dcc9df2546d04f2f (patch)
tree3527c18bab1f25e0f0fc919a71c6ed8e0f470961
parent54b65b83a2ae01de56d9eb329c59618559c1cc1d (diff)
[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
-rw-r--r--django/views/debug.py4
-rw-r--r--docs/releases/2.2.1.txt3
-rw-r--r--tests/view_tests/tests/test_debug.py18
3 files changed, 22 insertions, 3 deletions
diff --git a/django/views/debug.py b/django/views/debug.py
index b59fe29bdd..b9bae8fc1e 100644
--- a/django/views/debug.py
+++ b/django/views/debug.py
@@ -328,14 +328,14 @@ class ExceptionReporter:
def get_traceback_html(self):
"""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())
c = Context(self.get_traceback_data(), use_l10n=False)
return t.render(c)
def get_traceback_text(self):
"""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())
c = Context(self.get_traceback_data(), autoescape=False, use_l10n=False)
return t.render(c)
diff --git a/docs/releases/2.2.1.txt b/docs/releases/2.2.1.txt
index ab2a609a53..b24db37c1a 100644
--- a/docs/releases/2.2.1.txt
+++ b/docs/releases/2.2.1.txt
@@ -14,3 +14,6 @@ Bugfixes
(:ticket:`30307`).
* 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`).
diff --git a/tests/view_tests/tests/test_debug.py b/tests/view_tests/tests/test_debug.py
index db23d10d32..cdc01352a9 100644
--- a/tests/view_tests/tests/test_debug.py
+++ b/tests/view_tests/tests/test_debug.py
@@ -6,6 +6,7 @@ import sys
import tempfile
from io import StringIO
from pathlib import Path
+from unittest import mock
from django.core import mail
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.views.debug import (
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 (
@@ -610,6 +612,20 @@ class ExceptionReporterTests(SimpleTestCase):
text = reporter.get_traceback_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):
rf = RequestFactory()