【问题标题】:Jinja 2 For loop crashes Google App EngineJinja2 For 循环使 Google App Engine 崩溃
【发布时间】:2017-07-18 04:52:00
【问题描述】:

我有一个简单的 Jinja 模板测试 sn-p,我正在为 HTML 模板编写,但由于某些原因循环导致在线应用程序引擎和 devappserver 崩溃。我尝试用一​​个常量替换我的 for 循环的主题,只是为了测试实际的循环,并根据 Cloud SDK Shell 错误消息,我将它隔离到 for 循环的实际语法中。 sn-p 有什么问题?

错误:

  File "C:\Users\Skyler\Documents\Reverie\reflect\templates\index.html", 
line 9,
 in template
    {{% for test in my_list %}}
TemplateSyntaxError: unexpected '%'

index.html

<!DOCTYPE html>
<html>
<head>
    <title>{{title}}</title>
</head>
<body>
<h1> {{my_list[3]}} </h1>
<ul>
    {{% for test in my_list %}}
    <li>{{my_list[1]}}</li>
    {{% endfor %}}
</ul>
</body>
</html>

test.py

import webapp2
import jinja2
import os

template_dir = os.path.join(os.path.dirname(__file__), "templates")
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir), autoescape = True)

class Handler(webapp2.RequestHandler):
    def write(self, *a, **kw):
        self.response.write(*a, **kw)

    def render_str(self, template, **params):
        t = jinja_env.get_template(template)
        return t.render(params)

    def render(self, template, **kw):
        self.write(self.render_str(template, **kw))

class MainPage(Handler):
    """docstring for MainPage"""
    def get(self):
        self.render("index.html", title="Nani", my_list=[0,1,2,"string"])

app = webapp2.WSGIApplication([('/', MainPage),], debug=True)

app.yaml

runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /
  script: test.app

libraries:
- name: jinja2
  version: latest

完整的堆栈跟踪

ERROR    2017-07-18 05:02:36,960 webapp2.py:1528] unexpected '%'
Traceback (most recent call last):
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 1511, in __call__
    rv = self.handle_exception(request, response, e)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 1077, in __call__
    return handler.dispatch()
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 547, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "C:\Users\Skyler\Documents\Reverie\reflect\test.py", line 22, in get
    self.render("index.html", title="Nani", my_list=[0,1,2,"string"])
  File "C:\Users\Skyler\Documents\Reverie\reflect\test.py", line 17, in render
    self.write(self.render_str(template, **kw))
  File "C:\Users\Skyler\Documents\Reverie\reflect\test.py", line 13, in render_s
tr
    t = jinja_env.get_template(template)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\jinja2-2.6\jinja2\environment.py", line 719, in get_templa
te
    return self._load_template(name, self.make_globals(globals))
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\jinja2-2.6\jinja2\environment.py", line 693, in _load_temp
late
    template = self.loader.load(self, name, globals)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\jinja2-2.6\jinja2\loaders.py", line 127, in load
    code = environment.compile(source, name, filename)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\jinja2-2.6\jinja2\environment.py", line 493, in compile
    self.handle_exception(exc_info, source_hint=source)
  File "C:\Users\Skyler\Documents\Reverie\reflect\templates\index.html", line 9,
 in template
    {{% for test in my_list %}}
TemplateSyntaxError: unexpected '%'
ERROR    2017-07-18 05:02:36,960 wsgi.py:279]
Traceback (most recent call last):
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\google\appengine\runtime\wsgi.py", line 267, in Handle
    result = handler(dict(self._environ), self._StartResponse)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 1519, in __call__
    response = self._internal_error(e)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 1511, in __call__
    rv = self.handle_exception(request, response, e)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 1077, in __call__
    return handler.dispatch()
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 547, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\webapp2-2.3\webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "C:\Users\Skyler\Documents\Reverie\reflect\test.py", line 22, in get
    self.render("index.html", title="Nani", my_list=[0,1,2,"string"])
  File "C:\Users\Skyler\Documents\Reverie\reflect\test.py", line 17, in render
    self.write(self.render_str(template, **kw))
  File "C:\Users\Skyler\Documents\Reverie\reflect\test.py", line 13, in render_s
tr
    t = jinja_env.get_template(template)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\jinja2-2.6\jinja2\environment.py", line 719, in get_templa
te
    return self._load_template(name, self.make_globals(globals))
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\jinja2-2.6\jinja2\environment.py", line 693, in _load_temp
late
    template = self.loader.load(self, name, globals)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\jinja2-2.6\jinja2\loaders.py", line 127, in load
    code = environment.compile(source, name, filename)
  File "C:\Users\Skyler\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform
\google_appengine\lib\jinja2-2.6\jinja2\environment.py", line 493, in compile
    self.handle_exception(exc_info, source_hint=source)
  File "C:\Users\Skyler\Documents\Reverie\reflect\templates\index.html", line 9,
 in template
    {{% for test in my_list %}}
TemplateSyntaxError: unexpected '%'
INFO     2017-07-17 22:02:36,970 module.py:832] default: "GET / HTTP/1.1" 500 -

【问题讨论】:

    标签: python google-app-engine jinja2


    【解决方案1】:

    这可能是因为您似乎过多地使用了一个花括号。从docs看for循环:

    <title>{% block title %}{% endblock %}</title> <ul> {% for user in users %} <li><a href="{{ user.url }}">{{ user.username }}</a></li> {% endfor %} </ul>

    语句{% for user in users %} 中只有一个花括号,而您的语句使用两个花括号:{{% for test in my_list %}}

    改用:{% for test in my_list %} 看看会发生什么。

    【讨论】:

    • 就是这样,天哪,我花了很多时间对此视而不见。有趣的是,额外的大括号可能会导致错误,就解释器生命周期而言,知道为什么会出现这种情况吗?
    • @Skyler 我认为必须深入挖掘 jinja2 源代码才能找到为什么会这样。我同意它应该更优雅地失败。
    猜你喜欢
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多