Unlocalize line numbers and ids in debug 500 view.
While using USE_L10N, line numbers and IDs were printed as comma (or locale equivalent) separated values. Thanks Kronuz for the report and intial patch. Fixes #20861.
This commit is contained in:
parent
3f6cc33cff
commit
6c12cd15e9
|
@ -227,7 +227,7 @@ class ExceptionReporter(object):
|
||||||
return "File exists"
|
return "File exists"
|
||||||
|
|
||||||
def get_traceback_data(self):
|
def get_traceback_data(self):
|
||||||
"Return a Context instance containing traceback information."
|
"""Return a dictionary containing traceback information."""
|
||||||
|
|
||||||
if self.exc_type and issubclass(self.exc_type, TemplateDoesNotExist):
|
if self.exc_type and issubclass(self.exc_type, TemplateDoesNotExist):
|
||||||
from django.template.loader import template_source_loaders
|
from django.template.loader import template_source_loaders
|
||||||
|
@ -295,13 +295,13 @@ class ExceptionReporter(object):
|
||||||
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."
|
||||||
t = Template(TECHNICAL_500_TEMPLATE, name='Technical 500 template')
|
t = Template(TECHNICAL_500_TEMPLATE, name='Technical 500 template')
|
||||||
c = Context(self.get_traceback_data())
|
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."
|
||||||
t = Template(TECHNICAL_500_TEXT_TEMPLATE, name='Technical 500 template')
|
t = Template(TECHNICAL_500_TEXT_TEMPLATE, name='Technical 500 template')
|
||||||
c = Context(self.get_traceback_data(), autoescape=False)
|
c = Context(self.get_traceback_data(), autoescape=False, use_l10n=False)
|
||||||
return t.render(c)
|
return t.render(c)
|
||||||
|
|
||||||
def get_template_exception_info(self):
|
def get_template_exception_info(self):
|
||||||
|
|
|
@ -5,6 +5,7 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
import inspect
|
import inspect
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import sys
|
import sys
|
||||||
from tempfile import NamedTemporaryFile, mkdtemp, mkstemp
|
from tempfile import NamedTemporaryFile, mkdtemp, mkstemp
|
||||||
|
@ -69,6 +70,21 @@ class DebugViewTests(TestCase):
|
||||||
self.assertRaises(BrokenException, self.client.get,
|
self.assertRaises(BrokenException, self.client.get,
|
||||||
reverse('view_exception', args=(n,)))
|
reverse('view_exception', args=(n,)))
|
||||||
|
|
||||||
|
def test_non_l10ned_numeric_ids(self):
|
||||||
|
"""
|
||||||
|
Numeric IDs and fancy traceback context blocks line numbers shouldn't be localized.
|
||||||
|
"""
|
||||||
|
with self.settings(DEBUG=True, USE_L10N=True):
|
||||||
|
response = self.client.get('/views/raises500/')
|
||||||
|
# We look for a HTML fragment of the form
|
||||||
|
# '<div class="context" id="c38123208">', not '<div class="context" id="c38,123,208"'
|
||||||
|
self.assertContains(response, '<div class="context" id="', status_code=500)
|
||||||
|
match = re.search(b'<div class="context" id="(?P<id>[^"]+)">', response.content)
|
||||||
|
self.assertFalse(match is None)
|
||||||
|
id_repr = match.group('id')
|
||||||
|
self.assertFalse(re.search(b'[^c\d]', id_repr),
|
||||||
|
"Numeric IDs in debug response HTML page shouldn't be localized (value: %s)." % id_repr)
|
||||||
|
|
||||||
def test_template_exceptions(self):
|
def test_template_exceptions(self):
|
||||||
for n in range(len(except_args)):
|
for n in range(len(except_args)):
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -49,6 +49,7 @@ urlpatterns = patterns('',
|
||||||
(r'raises400/$', views.raises400),
|
(r'raises400/$', views.raises400),
|
||||||
(r'raises403/$', views.raises403),
|
(r'raises403/$', views.raises403),
|
||||||
(r'raises404/$', views.raises404),
|
(r'raises404/$', views.raises404),
|
||||||
|
(r'raises500/$', views.raises500),
|
||||||
|
|
||||||
# i18n views
|
# i18n views
|
||||||
(r'^i18n/', include('django.conf.urls.i18n')),
|
(r'^i18n/', include('django.conf.urls.i18n')),
|
||||||
|
|
|
@ -31,6 +31,14 @@ def raises(request):
|
||||||
except Exception:
|
except Exception:
|
||||||
return technical_500_response(request, *sys.exc_info())
|
return technical_500_response(request, *sys.exc_info())
|
||||||
|
|
||||||
|
def raises500(request):
|
||||||
|
# We need to inspect the HTML generated by the fancy 500 debug view but
|
||||||
|
# the test client ignores it, so we send it explicitly.
|
||||||
|
try:
|
||||||
|
raise Exception
|
||||||
|
except Exception:
|
||||||
|
return technical_500_response(request, *sys.exc_info())
|
||||||
|
|
||||||
def raises400(request):
|
def raises400(request):
|
||||||
raise SuspiciousOperation
|
raise SuspiciousOperation
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue