Caught all exceptions raised by Engine.get_default().

In addition to ImproperlyConfigured, Engine.get_default() may also raise
ImportError or other exceptions. It's better to catch all exceptions in
places where the default engine isn't strictly required.
This commit is contained in:
Aymeric Augustin 2015-02-05 11:38:58 +01:00
parent 9410d69835
commit 27f9ff459b
2 changed files with 13 additions and 4 deletions

View File

@ -177,8 +177,14 @@ class AdminSite(object):
"setting in order to use the admin application.")
try:
default_template_engine = Engine.get_default()
except ImproperlyConfigured:
# Skip the check if the user has a non-trivial TEMPLATES setting
except Exception:
# Skip this non-critical check:
# 1. if the user has a non-trivial TEMPLATES setting and Django
# can't find a default template engine
# 2. if anything goes wrong while loading template engines, in
# order to avoid raising an exception from a confusing location
# Catching ImproperlyConfigured suffices for 1. but 2. requires
# catching all exceptions.
pass
else:
if ('django.contrib.auth.context_processors.auth'

View File

@ -7,7 +7,6 @@ import sys
import types
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import resolve, Resolver404
from django.http import (HttpResponse, HttpResponseNotFound, HttpRequest,
build_request_repr)
@ -282,7 +281,11 @@ class ExceptionReporter(object):
"""Return a dictionary containing traceback information."""
try:
default_template_engine = Engine.get_default()
except ImproperlyConfigured:
except Exception:
# Since the debug view must never crash, catch all exceptions.
# If Django can't find a default template engine, get_default()
# raises ImproperlyConfigured. If some template engines fail to
# load, any exception may be raised.
default_template_engine = None
# TODO: add support for multiple template engines (#24120).