利用pycharm學(xué)習(xí)flask(五)

本文主要內(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ì)將其渲染成

&lt;h1&gt;Hello&lt;/ h1&gt;

瀏覽器能顯示這個(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)容衷恭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末随珠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窗看,更是在濱河造成了極大的恐慌,老刑警劉巖软瞎,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拉讯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吊奢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門页滚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人隧熙,你說(shuō)我怎么就攤上這事幻林。” “怎么了沪饺?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵整葡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)旬渠,這世上最難降的妖魔是什么端壳? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任更哄,我火速辦了婚禮,結(jié)果婚禮上成翩,老公的妹妹穿的比我還像新娘。我一直安慰自己栅炒,他們只是感情好术羔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著释移,像睡著了一般寥殖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熏纯,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天粤策,我揣著相機(jī)與錄音,去河邊找鬼秩贰。 笑死熊户,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嚷堡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沼琉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼桩匪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起傻昙,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妆档,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后贾惦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年绪颖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甜奄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雁乡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曲饱,我是刑警寧澤珠月,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站驻谆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胜臊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一黑忱、第九天 我趴在偏房一處隱蔽的房頂上張望勒魔。 院中可真熱鬧,春花似錦抚吠、人聲如沸唐全。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)延届。三九已至,卻和暖如春方庭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背头朱。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留龄减,地道東北人项钮。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像希停,于是被迫代替她去往敵國(guó)和親烁巫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容