Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

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

Thanks to robin for the report and claudep for the review.
  • Loading branch information...
commit 28a571348bca9c5a3c137e495e7d3c9349a5bd56 1 parent 9d11522
@bmispelon bmispelon authored
View
13 django/template/base.py
@@ -3,7 +3,7 @@
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 @@ def _resolve_lookup(self, context):
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
3  docs/releases/1.7.txt
@@ -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
6 tests/template_tests/tests.py
@@ -98,6 +98,9 @@ def method3(self):
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 @@ def get_template_tests(self):
# 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"),
Please sign in to comment.
Something went wrong with that request. Please try again.