【问题标题】:Python tornado, conditional template extensionPython龙卷风,条件模板扩展
【发布时间】:2015-04-13 12:53:04
【问题描述】:

我正在使用 tornadoweb 构建 Web 服务。我有两个不同的模板,其中包含 html head、导航栏以及服务对所有页面服务器通用的所有 UI。第一个,base.html 包含导航栏项目和其他仅显示给经过身份验证的用户的 html 元素。第二个,base_anon.html 更轻,包含一些可供匿名用户使用的项目。

现在我正在创建包含页面实际内容的第三个模板。我希望此模板可以扩展 base_anon.htmlbase.html,具体取决于用户是否经过身份验证。如果用户未通过身份验证,变量user 将为 Falsy。有没有办法进行条件模板扩展?

我尝试了以下方法:

{% if user %}
    {% extends "base.html" %}
{% else %}
    {% extends "base_anon.html" %}
{% end %}

其中,当由 tornado 渲染时会生成以下堆栈跟踪(仅复制堆栈的末尾):

Traceback (most recent call last):
  [...]
  File "[...]/lib/python2.7/site-packages/tornado/template.py", line 291, in _generate_python
    ancestors[0].generate(writer)
  File "[...]/lib/python2.7/site-packages/tornado/template.py", line 416, in generate
    self.body.generate(writer)
  File "[...]/lib/python2.7/site-packages/tornado/template.py", line 429, in generate
    chunk.generate(writer)
  File "[...]/lib/python2.7/site-packages/tornado/template.py", line 510, in generate
    self.body.generate(writer)
  File "[...]/lib/python2.7/site-packages/tornado/template.py", line 429, in generate
    chunk.generate(writer)
  File "[...]/lib/python2.7/site-packages/tornado/template.py", line 398, in generate
    raise NotImplementedError()
NotImplementedError

我没有更多信息可以解释这个错误。我在docs 中也找不到任何关于ifextends 语句之间冲突的信息。知道为什么会出现此错误吗?如果这确实是预期的,我还能如何根据某个变量的值使用不同的基本模板?

感谢阅读!

【问题讨论】:

    标签: python templates tornado


    【解决方案1】:

    目前无法按照您的要求进行操作。如果使用了{% extends %} 指令,它必须出现在顶层并且它的参数必须是一个常量;无法更改要扩展的模板。

    相反,可以考虑根据是否有登录用户使用不同的顶级模板,并将公共元素封装在UIModules 中。或者将所有 {% if %} 指令放在基本模板中,可能在 {% block %} 定义周围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      相关资源
      最近更新 更多