2

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>
Cœur
  • 37,241
  • 25
  • 195
  • 267
Ken Kinder
  • 12,654
  • 6
  • 50
  • 70
  • I posted a related question here: [Debug Jinja2 in Google App Engine](http://stackoverflow.com/questions/3086091/debug-jinja2-in-google-app-engine) – Brian M. Hunt Apr 01 '14 at 00:44

1 Answers1

1

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?

tux21b
  • 90,183
  • 16
  • 117
  • 101