.. _tutorial-templates: Step 6: 模版 ===================== 现在我们应该开始编写模版。如果我们现在请求 URLs,我们将会得到一个 Flask 无法找到模版的异常。 模版使用 `Jinja2`_ 语言以及默认开启自动转义。这就意味着除非你使用 :class:`~flask.Markup` 标记或在模板中使用 ``|safe`` 过滤器, 否则 Jinja2 会确保特殊字符比如 ``<`` 或 ``>`` 被转义成等价的 XML 实体。 我们也使用模版继承使得在网站的所有页面中重用布局成为可能。 请把如下的模版放入 `templates` 文件夹: .. _Jinja2: http://jinja.pocoo.org/2/documentation/templates layout.html ----------- 这个模板包含 HTML 主体结构,标题和一个登录链接(或者当用户已登入则提供注销)。如果有闪现信息的话它也将显示 闪现信息。``{% block body %}`` 块能够被子模版中的同样名字( ``body`` )的块替代。 :class:`~flask.session` 字典在模版中同样可用的,你能用它检查用户是否登录。注意在 Jinja 中你可以访问不存在的对象/字典属性或成员, 如同下面的代码, 即便 ``'logged_in'`` 键不存在,仍然可以正常工作: .. sourcecode:: html+jinja Flaskr

Flaskr

{% if not session.logged_in %} log in {% else %} log out {% endif %}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %} {% block body %}{% endblock %}
show_entries.html ----------------- 这个模版继承了上面的 `layout.html` 模版用来显示信息。注意 `for` 遍历了所有我们用 :func:`~flask.render_template` 函数传入的信息。我们同样告诉表单提交到 `add_entry` 函数且使用 `HTTP` 的 `POST` 方法: .. sourcecode:: html+jinja {% extends "layout.html" %} {% block body %} {% if session.logged_in %}
Title:
Text:
{% endif %} {% endblock %} login.html ---------- 最后是登录模板,基本上只显示一个允许用户登录的表单: .. sourcecode:: html+jinja {% extends "layout.html" %} {% block body %}

Login

{% if error %}

Error: {{ error }}{% endif %}

Username:
Password:
{% endblock %} 继续浏览 :ref:`tutorial-css` 。