Kaydet (Commit) 6c12cd15 authored tarafından Ramiro Morales's avatar Ramiro Morales

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.
üst 3f6cc33c
...@@ -227,7 +227,7 @@ class ExceptionReporter(object): ...@@ -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): ...@@ -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 ...@@ -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): ...@@ -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('', ...@@ -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): ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment