Fix #20745: Don't silence TypeError raised inside templates.

Thanks to robin for the report and claudep for the review.
This commit is contained in:
Baptiste Mispelon 2013-09-08 15:07:12 +02:00
parent 9d11522599
commit 28a571348b
3 changed files with 17 additions and 5 deletions

View File

@ -3,7 +3,7 @@ from __future__ import unicode_literals
import re
from functools import partial
from importlib import import_module
from inspect import getargspec
from inspect import getargspec, getcallargs
from django.conf import settings
from django.template.context import (BaseContext, Context, RequestContext,
@ -788,10 +788,13 @@ class Variable(object):
else:
try: # method call (assuming no args required)
current = current()
except TypeError: # arguments *were* required
# GOTCHA: This will also catch any TypeError
# raised in the function itself.
current = settings.TEMPLATE_STRING_IF_INVALID # invalid method call
except TypeError:
try:
getcallargs(current)
except TypeError: # arguments *were* required
current = settings.TEMPLATE_STRING_IF_INVALID # invalid method call
else:
raise
except Exception as e:
if getattr(e, 'silent_variable_failure', False):
current = settings.TEMPLATE_STRING_IF_INVALID

View File

@ -282,6 +282,9 @@ Templates
:setting:`TEMPLATE_DEBUG` is ``True``. This allows template origins to be
inspected and logged outside of the ``django.template`` infrastructure.
* ``TypeError`` exceptions are not longer silenced when raised during the
rendering of a template.
Backwards incompatible changes in 1.7
=====================================

View File

@ -98,6 +98,9 @@ class SomeClass:
def method4(self):
raise SomeOtherException
def method5(self):
raise TypeError
def __getitem__(self, key):
if key == 'silent_fail_key':
raise SomeException
@ -680,6 +683,9 @@ class TemplateTests(TransRealMixin, TestCase):
# Fail silently when accessing a non-simple method
'basic-syntax20': ("{{ var.method2 }}", {"var": SomeClass()}, ("","INVALID")),
# Don't silence a TypeError if it was raised inside a callable
'basic-syntax20b': ("{{ var.method5 }}", {"var": SomeClass()}, TypeError),
# Don't get confused when parsing something that is almost, but not
# quite, a template tag.
'basic-syntax21': ("a {{ moo %} b", {}, "a {{ moo %} b"),