Commit 28a57134 authored by Baptiste Mispelon's avatar Baptiste Mispelon
Browse files

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

Thanks to robin for the report and claudep for the review.
parent 9d115225
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -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:
                            try:
                                getcallargs(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
                            else:
                                raise
        except Exception as e:
            if getattr(e, 'silent_variable_failure', False):
                current = settings.TEMPLATE_STRING_IF_INVALID
+3 −0
Original line number Diff line number Diff line
@@ -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
=====================================

+6 −0
Original line number Diff line number Diff line
@@ -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"),