#24265 closed Bug (fixed)
jinja2 template backend results in KeyError
Reported by: | Rob Hudson | Owned by: | Aymeric Augustin |
---|---|---|---|
Component: | Template system | Version: | 1.8alpha1 |
Severity: | Normal | Keywords: | multiple-template-engines 1.8-beta |
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I created a new django 1.8a1 project. I made a couple settings changes, one of which was changing the single TEMPLATES config's 'BACKEND' to the jinja2 backend. I have no templates yet or URLs other than the default and attempted to visit the "It worked!" page but got a 500 instead.
Traceback follows:
Traceback (most recent call last): File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 85, in run self.result = application(self.environ, self.start_response) File "/Users/rob/.virtualenvs/tastytaps/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 64, in __call__ return self.application(environ, start_response) File "/Users/rob/.virtualenvs/tastytaps/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 191, in __call__ response = self.get_response(request) File "/Users/rob/.virtualenvs/tastytaps/lib/python2.7/site-packages/django/core/handlers/base.py", line 217, in get_response response = self.handle_uncaught_exception(request, resolver, sys.exc_info()) File "/Users/rob/.virtualenvs/tastytaps/lib/python2.7/site-packages/django/core/handlers/base.py", line 260, in handle_uncaught_exception return debug.technical_500_response(request, *exc_info) File "/Users/rob/.virtualenvs/tastytaps/lib/python2.7/site-packages/django/views/debug.py", line 100, in technical_500_response html = reporter.get_traceback_html() File "/Users/rob/.virtualenvs/tastytaps/lib/python2.7/site-packages/django/views/debug.py", line 382, in get_traceback_html c = Context(self.get_traceback_data(), use_l10n=False) File "/Users/rob/.virtualenvs/tastytaps/lib/python2.7/site-packages/django/views/debug.py", line 284, in get_traceback_data default_template_engine = Engine.get_default() File "/Users/rob/.virtualenvs/tastytaps/lib/python2.7/site-packages/django/utils/lru_cache.py", line 125, in wrapper result = user_function(*args, **kwds) File "/Users/rob/.virtualenvs/tastytaps/lib/python2.7/site-packages/django/template/engine.py", line 75, in get_default django_engines = [engine for engine in engines.all() File "/Users/rob/.virtualenvs/tastytaps/lib/python2.7/site-packages/django/template/utils.py", line 104, in all return [self[alias] for alias in self] File "/Users/rob/.virtualenvs/tastytaps/lib/python2.7/site-packages/django/template/utils.py", line 93, in __getitem__ backend = params.pop('BACKEND') KeyError: 'BACKEND'
I attempted to debug this -- it appears that the template settings are getting processed twice. The first time it works. The 2nd time it doesn't since the 'BACKEND' key was popped off the dict. Changing pop
to get
in django/template/utils.py:L93 fixed the issue for me.
Change History (7)
comment:1 by , 10 years ago
Keywords: | multiple-template-engines added |
---|---|
Owner: | changed from | to
Status: | new → assigned |
comment:2 by , 10 years ago
Keywords: | 1.8-beta added |
---|---|
Triage Stage: | Unreviewed → Accepted |
follow-up: 5 comment:3 by , 10 years ago
In order to reproduce this issue, I ran django-admin startproject mysite
and defined TEMPLATES
as follows:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.jinja2.Jinja2', 'DIRS': [], 'APP_DIRS': True, }, ]
I'm getting a similar stack trace when jinja2 isn't installed. On Python 3, thanks to exception chaining, the root cause is obvious; not so much on Python 2. Rob, can you confirm that installing jinja2 solves the problem for you?
If so, this is an error reporting issue.
comment:4 by , 10 years ago
Has patch: | set |
---|
PR 4058 proposes two changes related to this issue.
After the first commit, Django's debug page reports the ImportError
correctly instead of crashing in get_traceback_data()
.
That's a worthwhile improvement in itself. The debug page must be extremely robust. The multiple template engines refactor made it vulnerable to exceptions raised in Engine.get_default
. However that commit addresses the symptoms rather than the root cause.
The second commit ensures that Django keeps raising the same exceptions when importing or initializing a template backends fails. For extra safety, I added one test for each case.
comment:5 by , 10 years ago
Replying to aaugustin:
I'm getting a similar stack trace when jinja2 isn't installed. On Python 3, thanks to exception chaining, the root cause is obvious; not so much on Python 2. Rob, can you confirm that installing jinja2 solves the problem for you?
Yes, installing jinja2 fixes the issue. At the time I didn't have jinja2 installed -- I discovered it later after actually trying to create my first template.
comment:6 by , 10 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
I thought I had taken care of copying before mutating... I'll take care of this.