【发布时间】:2018-01-30 10:09:55
【问题描述】:
如标题所述,我关心的是如何将父 Jinja2 模板中设置的变量传递给其子模板。
项目的配置如下:
- 我正在使用 Tornado 构建 API。
- 在
app.py脚本中,我将端点/parent与 类ParentHandler。当执行 curl GET 方法时,get()ParentHandler类的方法被执行并呈现其结果,response(这是一个字典)到模板parent.html。我想使用呈现的 HTML 代码作为标题 子模板,所以在parent.html的末尾,有一个块 显示来自子模板的标签。 - 在
app.py中,我将端点'/child'关联到类ChildHanlder。执行 curl GET 方法时,将执行ChildHandler类的get()方法并将其结果child_content(这是一个 dict)呈现给模板child.html(我没有得到ParentHandler的response在ChildHandler,所以ChildHandler只渲染child_content)。模板child.html包括parent.html,所以我期望的行为是child.html显示来自parent.html的HTML 代码(使用ParentHandler提供的dictresponse中的值,而不是ChildHandler) 并渲染它自己的字典,child_content。
不幸的是,当我尝试执行上述过程时,child.html 没有从parent.py 中找到response。
这是一个代码sn-p:
app.py
class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r'/parent', ParentHandler),
(r'/child', ChildHandler)
]
jinja_load = Jinja2Loader(os.path.join(PATH, '/templates'))
settings = {
'template_path': os.path.join(PATH, '/templates')
'template_loader': jinja_load
}
tornado.web.Application.__init__(self, handlers, **settings)
父.py
class ParentHandler(tornado.web.RequestHandler):
def get(self):
response = {"status": "200", "val": "some_value"}
try:
self.render("parent.html", response=response)
except:
self.write(response)
child.py
class ChildHandler(tornado.web.RequestHandler):
def get(self):
response = {"status": "200", "data": "some_data"}
try:
self.render("child.html", child_content=response)
except:
self.write(response)
父.html
<div>
{% if response['status'] == 200 %}
{% set val1 = response.get('val', 0) %}
<i>{{ val1 }}</i>
{% endif %}
</div>
{% block child_content %}{% endblock %}
child.html
{% include 'parent.html' %}
{% from 'parent.html' import val1 %}
{% block child_content %}
<table>
{% for d in data %}
<tr>
<td>{{ d }}</td>
</tr>
{% endfor %}
{% endblock %}
但是当我尝试渲染 child.html 时出现这个错误:
UndefinedError: 'response' is undefined
谁能帮帮我?
【问题讨论】: