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:
Ramiro Morales 2012-10-20 07:50:44 -05:00
parent 3f6cc33cff
commit 6c12cd15e9
4 changed files with 28 additions and 3 deletions

View File

@ -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):

View File

@ -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:

View File

@ -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')),

View File

@ -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