本文主要內(nèi)容
Jinja2模版引擎
模板是一個(gè)包含響應(yīng)文本的文件,其中包含用占位變量表示的動(dòng)態(tài)部分,其具體值只在請(qǐng) 求的上下文中才能知道崭放。使用真實(shí)值替換變量,再返回最終得到的響應(yīng)字符串,這一過(guò)程 稱為渲染值骇。為了渲染模板,Flask 使用了一個(gè)名為 Jinja2 的強(qiáng)大模板引擎吱瘩。
視圖函數(shù)的作用是生成請(qǐng)求的響應(yīng)迹缀,里面可以包含函數(shù)和html代碼,但是把這兩部分放在一起會(huì)導(dǎo)致代碼難以理解和維護(hù)祝懂,所以就用模版來(lái)保存html代碼砚蓬。
Jinja2模板引擎
打開pycharm,在右側(cè)項(xiàng)目上右鍵新建一個(gè)templates文件夾保存模板文件灰蛙。在templates文件夾下新建index.html和user.html文件。分別輸入以下內(nèi)容
<h1>Hello World!</h1>
<h1>Hello, {{ name }}!</h1>
渲染模板
默認(rèn)情況下,Flask 在程序文件夾中的 templates 子文件夾中尋找模板物延。
為了使程序中的視圖函數(shù)渲染模板仅父,我們修改hello.py
from flask import Flask
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name)
if __name__ == '__main__':
app.run()
Flask 提供的 render_template 函數(shù)把 Jinja2 模板引擎集成到了程序中笙纤。render_template 函 數(shù)的第一個(gè)參數(shù)是模板的文件名。隨后的參數(shù)都是鍵值對(duì),表示模板中變量對(duì)應(yīng)的真實(shí) 值省容。在這段代碼中,第二個(gè)模板收到一個(gè)名為 name 的變量蓉冈。
變量
上面模板中使用的{{name}}結(jié)構(gòu)表示一個(gè)變量轩触,它是一種特殊的占位符家夺,告訴模板引擎這個(gè)位置的值從渲染模板時(shí)使用的數(shù)據(jù)中獲取。
可以使用過(guò)濾器修改變量,過(guò)濾器名添加在變量名之后,中間使用豎線分隔榨为。例如,下述 模板以首字母大寫形式顯示變量 name 的值:
Hello, {{ name|capitalize }}
safe 過(guò)濾器值得特別說(shuō)明一下煌茴。默認(rèn)情況下,出于安全考慮,Jinja2 會(huì)轉(zhuǎn)義所有變量。例如,如果一個(gè)變量的值為
<h1>Hello</h1>
Jinja2 會(huì)將其渲染成
<h1>Hello</ h1>
瀏覽器能顯示這個(gè) h1 元素,但不會(huì)進(jìn)行解釋矩乐。很多情況下需要顯示變量中存儲(chǔ) 的 HTML 代碼,這時(shí)就可使用 safe 過(guò)濾器回论。
千萬(wàn)別在不可信的值上使用 safe 過(guò)濾器,例如用戶在表單中輸入的文本。
完整的過(guò)濾器列表可在 Jinja2 文檔
http://jinja.pocoo.org/docs/templates/#builtin-filters
查看傀蓉。
控制結(jié)構(gòu)
Jinja2 提供了多種控制結(jié)構(gòu),可用來(lái)改變模板的渲染流程葬燎。
下面這個(gè)例子展示了如何在模板中使用條件控制語(yǔ)句:
{% if user %}
Hello, {{ user }}!
{% else %}
Hello, Stranger!
{% endif %}
另一種常見需求是在模板中渲染一組元素。下例展示了如何使用 for 循環(huán)實(shí)現(xiàn)這一需求:
<ul>
{% for comment in comments %}
<li>{{ comment }}</li> {% endfor %}
</ul>
Jinja2 還支持宏窑邦。宏類似于 Python 代碼中的函數(shù)岳遥。例如:
{% macro render_comment(comment) %} <li>{{ comment }}</li>
{% endmacro %}
<ul>
{% for comment in comments %}
{{ render_comment(comment) }} {% endfor %}
</ul>
為了重復(fù)使用宏,我們可以將其保存在單獨(dú)的文件中,然后在需要使用的模板中導(dǎo)入:
{% import 'macros.html' as macros %} <ul>
{% for comment in comments %}
{{ macros.render_comment(comment) }}
{% endfor %} </ul>
需要在多處重復(fù)使用的模板代碼片段可以寫入單獨(dú)的文件,再包含在所有模板中,以避免 重復(fù):
{% include 'common.html' %}
另一種重復(fù)使用代碼的強(qiáng)大方式是模板繼承,它類似于 Python 代碼中的類繼承。首先,創(chuàng)
建一個(gè)名為 base.html 的基模板:
<html>
<head>
{% block head %}
<title>{% block title %}{% endblock %} - My Application</title> {% endblock %}
</head>
<body>
{% block body %}
{% endblock %} </body>
</html>
block 標(biāo)簽定義的元素可在衍生模板中修改派继。在本例中,我們定義了名為 head捻艳、title 和
body 的塊。注意,title 包含在 head 中绅络。下面這個(gè)示例是基模板的衍生模板:
{% extends "base.html" %}
{% block title %}Index{% endblock %} {% block head %}
{{ super() }}
<style>
</style>
{% endblock %}
{% block body %} <h1>Hello, World!</h1>
{% endblock %}
extends 指令聲明這個(gè)模板衍生自 base.html。在 extends 指令之后,基模板中的 3 個(gè)塊被 重新定義,模板引擎會(huì)將其插入適當(dāng)?shù)奈恢蒙夹蟆W⒁庑露x的 head 塊,在基模板中其內(nèi)容不 是空的,所以使用 super() 獲取原來(lái)的內(nèi)容衷恭。