Flask模板

一.Flask模板中的特殊變量和函數(shù)

用途:可以在自己的模板中訪問一些Flask默認(rèn)內(nèi)置的函數(shù)和對(duì)象.當(dāng)然灸姊,這些變量在視圖中也可以使用.

1.config

可以從模板中直接訪問Flask當(dāng)前的config的對(duì)象:

{{ config.DEBUG}}?

{{config.SECRET_KEY}}

可以寫成列表形式或者:

{{[config.DEBUG, config.SECRET_KEY]}} --> 結(jié)果是列表

或者 {{ config.DEBUG, config.SECRET_KEY}}

2.request

即Flask中代表當(dāng)前請(qǐng)求的request對(duì)象

{{request.url}} ?--> http://127.0.0.1:5000/

3.session

即Flask的session對(duì)象

{{session.username}} --> qia

4.g變量

在視圖中設(shè)置g變量的 name 屬性的值黍析,然后在模板中直接可以取出.

{{g.name}}

5.url_for

? ? url_for會(huì)根據(jù)傳入的路由器函數(shù)名,返回該路由對(duì)應(yīng)的URL,在模板中始終使用url_for()就可以安全的修改路由綁定的URL,則不必須擔(dān)心模板中渲染出錯(cuò)的鏈接:

{{url_for('index'}}} --> /qi

? ? 如果我們定義的路由URL是帶有參數(shù)的,則可以把它們作為關(guān)鍵字參數(shù)傳入url_for(),Flask會(huì)把他們填充進(jìn)最終生成的URL中:

{{ url_for('post', post_id=1)}} ?-->/post/1

6.get_flashed_messages()

? ? ? ?這個(gè)函數(shù)會(huì)返回之前在flask中通過flask()傳入的消息的列表光绕,flash函數(shù)的作用很簡(jiǎn)單,可以把由Python字符串表示的消息加入一個(gè)消息隊(duì)列中健无,再使用get_flashed_message()函數(shù)取出它們并消費(fèi)掉:

{%for message in get_flashed_messages()%}

? ? {{message}}

{%endfor%}

二.模板代碼的復(fù)用

Flask中模板代碼的復(fù)用有 3 種方式:

宏: 多個(gè)模板具有完全相同的頂部和底部?jī)?nèi)容谱邪。

繼承:多個(gè)模板中具有相同的模板代碼內(nèi)容蒲拉,但是內(nèi)容中部分值不一樣慌随。

包括:(多個(gè))模板中具有完全相同的 html 代碼塊內(nèi)容。

1.宏

對(duì)宏(macro)的理解:

? ? 把它看作 Jinja2 中的一個(gè)函數(shù)焰坪,它會(huì)返回一個(gè)模板或者 HTML 字符串.

? ? 為了避免反復(fù)地編寫同樣的模板代碼趣倾,出現(xiàn)代碼冗余,可以把他們寫成函數(shù)以進(jìn)行重用.

? ? 需要在多處重復(fù)使用的模板代碼片段可以寫入單獨(dú)的文件某饰,再包含在所有模板中儒恋,以避免重復(fù).

使用:包括 定義 和 調(diào)用 2 個(gè)步驟.

<1>定義宏

定義語法:{% macro 函數(shù)名(參數(shù))%}

? ? ? ? ? ? ? ?復(fù)用代碼塊

? ? ? ? ? {% endmacro %}

使用:

{% macro input(name,value='',type='text') %}

? ? <input type="{{type}}" name="{{name}}"

? ? ? ? value="{{value}}" class="form-control">

{% endmacro %}

<2>調(diào)用宏

調(diào)用語法:{ % import '宏文件所在文件名' as 別名}

? ? ? ? ? {{ 別名.調(diào)用宏的函數(shù)名(參數(shù))}}

{{ input('name' value='zs')}}

這會(huì)輸出

<input type="text" name="name"

? ? value="zs" class="form-control">

主要用途:

把宏單獨(dú)抽取出來,封裝成html文件黔漂,其它模板中導(dǎo)入使用诫尽,文件名可以自定義macro.html

{% macro function(type='text', name='', value='') %}

<input type="{{type}}" name="{{name}}"

value="{{value}}" class="form-control">

{% endmacro %}

在其它模板文件中先導(dǎo)入,再調(diào)用

{% import 'macro.html' as func %}

{% func.function() %}

2.模板繼承

? ? ? ?模板繼承是為了重用模板中的公共內(nèi)容炬守。一般Web開發(fā)中牧嫉,繼承主要使用在網(wǎng)站的頂部菜單、底部减途。這些內(nèi)容可以定義在父模板中酣藻,子模板直接繼承,而不需要重復(fù)書寫鳍置。

標(biāo)簽定義的內(nèi)容

{% block top %} {% endblock %}

相當(dāng)于在父模板中挖個(gè)坑辽剧,當(dāng)子模板繼承父模板時(shí),可以進(jìn)行填充税产。

子模板使用 extends 指令聲明這個(gè)模板繼承自哪個(gè)模板

父模板中定義的塊在子模板中被重新定義抖仅,在子模板中調(diào)用父模板的內(nèi)容可以使用super()

父模板

base.html

{% block top %}

? 頂部菜單

{% endblock top %}

{% block content %}

{% endblock content %}

{% block bottom %}

? 底部

{% endblock bottom %}

子模板

extends指令聲明這個(gè)模板繼承自哪

{% extends 'base.html' %}

{% block content %}

?需要填充的內(nèi)容

{% endblock content %}

模板繼承使用時(shí)注意點(diǎn):

<1>不支持多繼承

<2>為了便于閱讀,在子模板中使用extends時(shí)砖第,盡量寫在模板的第一行撤卢。

<3>不能在一個(gè)模板文件中定義多個(gè)相同名字的block標(biāo)簽。

<4>當(dāng)在頁面中使用多個(gè)block標(biāo)簽時(shí)梧兼,建議給結(jié)束標(biāo)簽起個(gè)名字放吩,當(dāng)多個(gè)block嵌套時(shí),閱讀性更好羽杰。

父模板和子模板的特點(diǎn)和功能:

父模板:抽取多個(gè)模板頁面中的相同部分,一般包括頂部/中間/底部?jī)?nèi)容

子模板:繼承父模板,可以完全服用父模板內(nèi)容,也可以在父模板的基礎(chǔ)上實(shí)現(xiàn)自己特有的頁面內(nèi)容.

<1>如果想要實(shí)現(xiàn)自己特有的頁面內(nèi)容,重寫指定區(qū)域塊,自己填充內(nèi)容;

<2>如果不想要父模板中的部分內(nèi)容,直接聲明區(qū)域塊,內(nèi)容為空.

<3>如果既要實(shí)現(xiàn)自己的特有內(nèi)容,又想使用父模板的,使用super().

<4>可以使用多繼承,但是不建議使用.

3.包含

? ? ? ?Jinja2模板中渡紫,除了宏和繼承到推,還支持一種代碼重用的功能,叫包含(Include)惕澎。它的功能是將另一個(gè)模板整個(gè)加載到當(dāng)前模板中莉测,并直接渲染。

本質(zhì):代碼完全復(fù)用.

include的使用

{% include 'hello.html' %}

包含在使用時(shí)唧喉,如果包含的模板文件不存在時(shí)捣卤,程序會(huì)拋出TemplateNotFound異常,可以加上 ignore missing 關(guān)鍵字八孝。如果包含的模板文件不存在董朝,會(huì)忽略這條include語句。

include 的使用加上關(guān)鍵字ignore missing

{% include 'hello.html' ignore missing %}

三.控制代碼塊

? ? ? ? 控制代碼塊主要包含兩個(gè):

- if/else if /else / endif

- for / endfor

1. if語句

Jinja2 語法中的if語句跟 Python 中的 if 語句相似,后面的布爾值或返回布爾值的表達(dá)式將決定代碼中的哪個(gè)流程會(huì)被執(zhí)行:

{%if user.is_logged_in() %}

? ? <a href='/logout'>Logout</a>

{% else %}

? ? <a href='/login'>Login</a>

{% endif %}

過濾器可以被用在 if 語句中:

{% if comments | length > 0 %}

? ? There are {{ comments | length }} comments

{% else %}

? ? There are no comments

{% endif %}

2. 循環(huán)

我們可以在 Jinja2 中使用循環(huán)來迭代任何列表或者生成器函數(shù)

{% for post in posts %}

? ? <div>

? ? ? ? <h1>{{ post.title }}</h1>

? ? ? ? <p>{{ post.text | safe }}</p>

? ? </div>

{% endfor %}

循環(huán)和if語句可以組合使用干跛,以模擬 Python 循環(huán)中的 continue 功能子姜,下面這個(gè)循環(huán)將只會(huì)渲染post.text不為None的那些post:

{% for post in posts if post.text %}

? ? <div>

? ? ? ? <h1>{{ post.title }}</h1>

? ? ? ? <p>{{ post.text | safe }}</p>

? ? </div>

{% endfor %}

在一個(gè) for 循環(huán)塊中你可以訪問這些特殊的變量:

變量?? ?描述

loop.index?? ?當(dāng)前循環(huán)迭代的次數(shù)(從 1 開始)

loop.index0?? ?當(dāng)前循環(huán)迭代的次數(shù)(從 0 開始)

loop.revindex?? ?到循環(huán)結(jié)束需要迭代的次數(shù)(從 1 開始)

loop.revindex0?? ?到循環(huán)結(jié)束需要迭代的次數(shù)(從 0 開始)

loop.first?? ?如果是第一次迭代,為 True 楼入。

loop.last?? ?如果是最后一次迭代哥捕,為 True 。

loop.length?? ?序列中的項(xiàng)目數(shù)嘉熊。

loop.cycle?? ?在一串序列間期取值的輔助函數(shù)遥赚。見下面示例程序。

在循環(huán)內(nèi)部,你可以使用一個(gè)叫做loop的特殊變量來獲得關(guān)于for循環(huán)的一些信息

比如:要是我們想知道當(dāng)前被迭代的元素序號(hào)记舆,并模擬Python中的enumerate函數(shù)做的事情,則可以使用loop變量的index屬性,例如:

{% for post in posts%}

{{loop.index}}, {{post.title}}

{% endfor %}

會(huì)輸出這樣的結(jié)果

1, Post title

2, Second Post

cycle函數(shù)會(huì)在每次循環(huán)的時(shí)候,返回其參數(shù)中的下一個(gè)元素,可以拿上面的例子來說明:

{% for post in posts%}

{{loop.cycle('odd','even')}} {{post.title}}

{% endfor %}

會(huì)輸出這樣的結(jié)果:

odd Post Title

even Second Post

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呼巴,一起剝皮案震驚了整個(gè)濱河市泽腮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衣赶,老刑警劉巖诊赊,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異府瞄,居然都是意外死亡碧磅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門遵馆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲸郊,“玉大人,你說我怎么就攤上這事货邓「汛椋” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵换况,是天一觀的道長(zhǎng)职辨。 經(jīng)常有香客問我盗蟆,道長(zhǎng),這世上最難降的妖魔是什么舒裤? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任喳资,我火速辦了婚禮,結(jié)果婚禮上腾供,老公的妹妹穿的比我還像新娘仆邓。我一直安慰自己,他們只是感情好台腥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布宏赘。 她就那樣靜靜地躺著,像睡著了一般黎侈。 火紅的嫁衣襯著肌膚如雪察署。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天峻汉,我揣著相機(jī)與錄音贴汪,去河邊找鬼。 笑死休吠,一個(gè)胖子當(dāng)著我的面吹牛扳埂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘤礁,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼阳懂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了柜思?” 一聲冷哼從身側(cè)響起岩调,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赡盘,沒想到半個(gè)月后号枕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陨享,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年葱淳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抛姑。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赞厕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出定硝,到底是詐尸還是另有隱情坑傅,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布喷斋,位于F島的核電站唁毒,受9級(jí)特大地震影響蒜茴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浆西,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一粉私、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧近零,春花似錦诺核、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至裙士,卻和暖如春入客,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腿椎。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工桌硫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啃炸。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓铆隘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親南用。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膀钠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,184評(píng)論 22 257
  • 上一節(jié)講了如何安裝:-python輕量框架--Flask(入門教程)這一節(jié)講Flask模板裹虫。 1.回顧 上一節(jié)目錄...
    可汗?fàn)敔?/span>閱讀 18,173評(píng)論 1 10
  • 模板 1.使用Flask-Bootstrap集成Twitter Bootstrap 初始化 Flask-Boots...
    入間閱讀 889評(píng)論 0 1
  • 關(guān)于繼承,都是面向?qū)ο蟮娜筇卣髦械钠渲幸环N,所以如果有別的面向?qū)ο笳Z言基礎(chǔ),關(guān)于繼承個(gè)概念,也不用多講.Flas...
    LoveLinXue閱讀 863評(píng)論 0 0
  • 人的一生肿嘲,難免遭遇各種困境,有時(shí)候恒界,你會(huì)覺得心力俱疲睦刃,甚至是想放棄砚嘴。 困難時(shí)自己堅(jiān)持就好 沒有必要向他人訴苦 遇到...
    wty_1219桐雨閱讀 662評(píng)論 0 2