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
This commit is contained in:
Luke Plant 2011-01-13 13:47:03 +00:00
parent e1ede214e6
commit 80f4826063
2 changed files with 10 additions and 2 deletions

View File

@ -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:
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 = """
{% 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>

View File

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