Whenever there is an error in an inherited Jinja2 template in my App Engine project, I get a traceback that specifies only the line that caused the inheritance, not the line that caused the error.
For example, I created a dummy project with two templates, page.html and base.html. page.html inherits from base.html and base.html has the line designed to cause an error. Rather than reporting the error in base.html, App Engine/Jinja will give me this traceback:
Traceback (most recent call last):
File "/home/kkinder/Software/google_appengine/lib/webapp2/webapp2.py", line 1536, in __call__
rv = self.handle_exception(request, response, e)
File "/home/kkinder/Software/google_appengine/lib/webapp2/webapp2.py", line 1530, in __call__
rv = self.router.dispatch(request, response)
File "/home/kkinder/Software/google_appengine/lib/webapp2/webapp2.py", line 1278, in default_dispatcher
return route.handler_adapter(request, response)
File "/home/kkinder/Software/google_appengine/lib/webapp2/webapp2.py", line 1102, in __call__
return handler.dispatch()
File "/home/kkinder/Software/google_appengine/lib/webapp2/webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
File "/home/kkinder/Software/google_appengine/lib/webapp2/webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
File "/home/kkinder/Projects/JinjaTestProject/main.py", line 11, in get
self.response.out.write(self.jinja2.render_template('page.html'))
File "/home/kkinder/Software/google_appengine/lib/webapp2/webapp2_extras/jinja2.py", line 158, in render_template
return self.environment.get_template(_filename).render(**context)
File "/home/kkinder/Software/google_appengine/lib/jinja2/jinja2/environment.py", line 894, in render
return self.environment.handle_exception(exc_info, True)
File "templates/page.html", line 1, in top-level template code
{% extends 'base.html' %}
UndefinedError: 'doesnotexist' is undefined
main.py:
import webapp2
from webapp2_extras import jinja2
class MainHandler(webapp2.RequestHandler):
@webapp2.cached_property
def jinja2(self):
return jinja2.get_jinja2(app=self.app)
def get(self):
self.response.out.write(self.jinja2.render_template('page.html'))
app = webapp2.WSGIApplication([('/', MainHandler)],
debug=True)
page.html:
{% extends 'base.html' %}
{% block content %}
Stuff
{% endblock %}
base.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
</head>
<body>
<h1>{{ doesnotexist.foo }}</h1>
{% block content %}{% endblock %}
</body>
</html>
Unfortunately, it’s not possible to get better debug information for Jinja2 on GAE in production, because they have restricted the access to the required packages. You can find more information about this problem on the official FAQ: My tracebacks look weird. What’s happening?