接下來我們應(yīng)該創(chuàng)建模板了。如果我們現(xiàn)在請求 URL,只會得到 Flask 無法找到模板的異常。 模板使用 Jinja2 語法并默認(rèn)開啟自動轉(zhuǎn)義。這意味著除非你使用 Markup 標(biāo)記或在模板中使用 |safe 過濾器,否則 Jinja 2 會 確保特殊字符,比如 <> 被轉(zhuǎn)義為等價的 XML 實體。

我們也會使用模板繼承在網(wǎng)站的所有頁面中重用布局。

將下面的模板放在 templates 文件夾里:

layout.html

這個模板包含 HTML 主體結(jié)構(gòu)、標(biāo)題和一個登入鏈接(用戶已登入則提供登出)。 如果有,它也會顯示閃現(xiàn)消息。 {% block body %} 塊可以被子模板中相同名 字的塊( body )替換。

session 字典在模板中也是可用的。你可以用它來檢查用戶是否已登入。 注意,在 Jinja 中你可以訪問不存在的對象/字典屬性或成員。比如下面的代碼, 即便 'logged_in' 鍵不存在,仍然可以正常工作:

<!doctype html>
<title>Flaskr</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
<div class=page>
  <h1>Flaskr</h1>
  <div class=metanav>
  {% if not session.logged_in %}
    <a href="{{ url_for('login') }}">log in</a>
  {% else %}
    <a href="{{ url_for('logout') }}">log out</a>
  {% endif %}
  </div>
  {% for message in get_flashed_messages() %}
    <div class=flash>{{ message }}</div>
  {% endfor %}
  {% block body %}{% endblock %}
</div>

show_entries.html

這個模板繼承了上面的 layout.html 模板來顯示消息。注意 for 循環(huán)會遍歷并輸出 所有 render_template() 函數(shù)傳入的消息。我們還告訴表單使用 HTTPPOST 方法提交信息到 add_entry 函數(shù):

{% extends "layout.html" %}
{% block body %}
  {% if session.logged_in %}
    <form action="{{ url_for('add_entry') }}" method=post class=add-entry>
      <dl>
        <dt>Title:
        <dd><input type=text size=30 name=title>
        <dt>Text:
        <dd><textarea name=text rows=5 cols=40></textarea>
        <dd><input type=submit value=Share>
      </dl>
    </form>
  {% endif %}
  <ul class=entries>
  {% for entry in entries %}
    <li><h2>{{ entry.title }}</h2>{{ entry.text|safe }}
  {% else %}
    <li><em>Unbelievable.  No entries here so far</em>
  {% endfor %}
  </ul>
{% endblock %}

login.html

最后是登入模板,只是簡單地顯示一個允許用戶登入的表單:

{% extends "layout.html" %}
{% block body %}
  <h2>Login</h2>
  {% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
  <form action="{{ url_for('login') }}" method=post>
    <dl>
      <dt>Username:
      <dd><input type=text name=username>
      <dt>Password:
      <dd><input type=password name=password>
      <dd><input type=submit value=Login>
    </dl>
  </form>
{% endblock %}

繼續(xù) Flask 添加樣式