diff --git a/django/views/debug.py b/django/views/debug.py index 18e961aa55..cb3e8c7ec1 100644 --- a/django/views/debug.py +++ b/django/views/debug.py @@ -497,7 +497,7 @@ def technical_404_response(request, exception): module = obj.__module__ caller = '%s.%s' % (module, caller) - with Path(CURRENT_DIR, 'templates', 'technical_404.html').open() as fh: + with Path(CURRENT_DIR, 'templates', 'technical_404.html').open(encoding='utf-8') as fh: t = DEBUG_ENGINE.from_string(fh.read()) c = Context({ 'urlconf': urlconf, @@ -514,7 +514,7 @@ def technical_404_response(request, exception): def default_urlconf(request): """Create an empty URLconf 404 error response.""" - with Path(CURRENT_DIR, 'templates', 'default_urlconf.html').open() as fh: + with Path(CURRENT_DIR, 'templates', 'default_urlconf.html').open(encoding='utf-8') as fh: t = DEBUG_ENGINE.from_string(fh.read()) c = Context({ 'version': get_docs_version(), diff --git a/tests/view_tests/tests/test_debug.py b/tests/view_tests/tests/test_debug.py index 51b27bf361..a61e4b24ff 100644 --- a/tests/view_tests/tests/test_debug.py +++ b/tests/view_tests/tests/test_debug.py @@ -224,6 +224,19 @@ class DebugViewTests(SimpleTestCase): status_code=404 ) + 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. + """ + with mock.patch.object(DebugPath, 'open') as m: + default_urlconf(None) + m.assert_called_once_with(encoding='utf-8') + m.reset_mock() + technical_404_response(mock.MagicMock(), mock.Mock()) + m.assert_called_once_with(encoding='utf-8') + class DebugViewQueriesAllowedTests(SimpleTestCase): # May need a query to initialize MySQL connection