Kaydet (Commit) 80f48260 authored tarafından Luke Plant's avatar Luke Plant

Fixed #15025 - template debug fails if there's a callable local var that generates an exception

Thanks to Tai Lee for the patch and report, also to Don Spaulding.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15187 bcc190cf-cafb-0310-a4f2-bffc1f526a37
üst e1ede214
...@@ -8,11 +8,11 @@ from django.conf import settings ...@@ -8,11 +8,11 @@ from django.conf import settings
from django.http import HttpResponse, HttpResponseServerError, HttpResponseNotFound from django.http import HttpResponse, HttpResponseServerError, HttpResponseNotFound
from django.template import (Template, Context, TemplateDoesNotExist, from django.template import (Template, Context, TemplateDoesNotExist,
TemplateSyntaxError) TemplateSyntaxError)
from django.template.defaultfilters import force_escape, pprint
from django.utils.html import escape from django.utils.html import escape
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils.encoding import smart_unicode, smart_str from django.utils.encoding import smart_unicode, smart_str
HIDDEN_SETTINGS = re.compile('SECRET|PASSWORD|PROFANITIES_LIST|SIGNATURE') HIDDEN_SETTINGS = re.compile('SECRET|PASSWORD|PROFANITIES_LIST|SIGNATURE')
def linebreak_iter(template_source): def linebreak_iter(template_source):
...@@ -109,6 +109,9 @@ class ExceptionReporter: ...@@ -109,6 +109,9 @@ class ExceptionReporter:
self.get_template_exception_info() self.get_template_exception_info()
frames = self.get_traceback_frames() frames = self.get_traceback_frames()
for i, frame in enumerate(frames):
frame['vars'] = [(k, force_escape(pprint(v))) for k, v in frame['vars']]
frames[i] = frame
unicode_hint = '' unicode_hint = ''
if issubclass(self.exc_type, UnicodeError): if issubclass(self.exc_type, UnicodeError):
...@@ -547,7 +550,7 @@ TECHNICAL_500_TEMPLATE = """ ...@@ -547,7 +550,7 @@ TECHNICAL_500_TEMPLATE = """
{% for var in frame.vars|dictsort:"0" %} {% for var in frame.vars|dictsort:"0" %}
<tr> <tr>
<td>{{ var.0|force_escape }}</td> <td>{{ var.0|force_escape }}</td>
<td class="code"><pre>{{ var.1|pprint|force_escape }}</pre></td> <td class="code"><pre>{{ var.1 }}</pre></td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
......
...@@ -36,6 +36,11 @@ def custom_create(request): ...@@ -36,6 +36,11 @@ def custom_create(request):
form_class=SlugChangingArticleForm) form_class=SlugChangingArticleForm)
def raises(request): def raises(request):
# Make sure that a callable that raises an exception in the stack frame's
# local vars won't hijack the technical 500 response. See:
# http://code.djangoproject.com/ticket/15025
def callable():
raise Exception
try: try:
raise Exception raise Exception
except Exception: except Exception:
......
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