mirror of https://github.com/django/django.git
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:
parent
9d11522599
commit
28a571348b
|
@ -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
|
||||
|
|
|
@ -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
|
||||
=====================================
|
||||
|
||||
|
|
|
@ -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"),
|
||||
|
|
Loading…
Reference in New Issue