Flask模板引擎之Jinja2語(yǔ)法介紹
Jinja是組成Flask的模板引擎??赡苣氵€不太了解它是干嘛的,但你對(duì)下面這些百分號(hào)和大括號(hào)肯定不陌生:
{% block body %}
<ul>
{% for user in users %}
<li><a href="{{ user.url }}" rel="external nofollow" >{{ user.username }}</a></li>
{% endfor %}
</ul>
{% endblock %}
看過(guò)《Flask Web開(kāi)發(fā)》,很多人都能寫(xiě)出來(lái)這些,但除了書(shū)里講的,你還應(yīng)該了解一些其他的語(yǔ)法細(xì)節(jié)。這篇文章就來(lái)介紹一些常用的語(yǔ)法和函數(shù),如果想要系統(tǒng)完整的了解Jinja,可以去讀它的文檔:Jinja2 Documentation。
FAQ
在Jinja網(wǎng)站上的FAQ里,我挑了三個(gè)大家可能會(huì)比較感興趣的問(wèn)題(簡(jiǎn)單翻譯了一下)。
1、為什么要叫Jinja?
之所以叫Jinja,是因?yàn)槿毡镜纳裆纾↗inja)英文單詞是temple,而模板的英文是template,兩者發(fā)音很相似(這么說(shuō)來(lái),它本來(lái)也有可能叫Miao的……)。
2、Jinja的速度怎么樣?
和Mako差不多,但比Genshi以及Django的模板引擎快10~20倍。
3、把邏輯判斷(Logic)放到模板里是個(gè)好主意嗎?
毫無(wú)疑問(wèn),你放到模板里邏輯判斷(Logic)應(yīng)該越少越好。但為了讓大家都開(kāi)心,適當(dāng)?shù)倪壿嬇袛嗍切枰摹1M管如此,它有很多對(duì)于你能做什么,不能做什么的限制。
出于諸多考慮(速度,易讀性等等),Jinja既不允許你放置任意的Python代碼,也不允許所有的Python表達(dá)式。這也是為什么我們要了解Jinja2的語(yǔ)法。
Delimiters(分隔符)
{% ... %} 語(yǔ)句(Statements)
{{ ... }} 打印模板輸出的表達(dá)式(Expressions)
{# ... #} 注釋
# ... ## 行語(yǔ)句(Line Statements)
多說(shuō)一下注釋?zhuān)@是單行注釋?zhuān)?/p>
{#% for user in users %#}
下面是多行注釋?zhuān)?/p>
{# note: commented-out template because we no longer use this
{% for user in users %}
...
{% endfor %}
#}
Variables(變量)
除了普通的字符串變量,Jinja2還支持列表、字典和對(duì)象,你可以這樣獲取變量值:
{{ mydict['key'] }}
{{ mylist[3] }}
{{ mylist[myintvar] }}
{{ myobj.somemethod() }}
獲取一個(gè)變量的屬性有兩種方式:
{{ foo.bar }}
{{ foo['bar'] }}
這兩種方法基本相同(深層次的區(qū)別可以暫不考慮)
Filter(過(guò)濾器)
過(guò)濾器用來(lái)修改變量,使用一個(gè)豎線和變量相隔。
{{ items|join(', ') }}
常用的內(nèi)置過(guò)濾器:
- safe 渲染時(shí)不轉(zhuǎn)義
- capitalize 首字母大寫(xiě)
- lower 小寫(xiě)
- upper 大寫(xiě)
- title 每個(gè)單詞的首字母都轉(zhuǎn)換成大寫(xiě)
- trim 去掉首尾空格
- striptags 去掉值里的HTML標(biāo)簽
- default 設(shè)置一個(gè)默認(rèn)值,如果變量未定義,就用這個(gè)默認(rèn)值替換。類(lèi)似這樣:
{{ my_variable|default('my_variable is not defined') }}
- random(seq) 返回一個(gè)序列里的隨機(jī)元素
- truncate(s, length=255, killwords=False, end='...') 截取出指定長(zhǎng)度的文章(文章摘要)
- format(value, *args, **kwargs) 參考Python的字符串格式化函數(shù)
- length 左邊如果是列表,輸出列表的數(shù)量;如果是字符串,則輸出字符串的長(zhǎng)度
- ……
完整的fliter列表:http://jinja.pocoo.org/docs/dev/templates/#builtin-filters
Tests(測(cè)試,判斷)
Jinja2提供的tests可以用來(lái)在語(yǔ)句里對(duì)變量或表達(dá)式進(jìn)行測(cè)試,如果要測(cè)試一個(gè)變量,可以在變量后加上“is”和test名,比如:
{% if user.age is equalto 42 %} {# 這里也可以寫(xiě)成... is equalto(42) #}
Ha, you are 42!
{% endif %}
如果要傳入?yún)?shù),可以在test后增加括號(hào),也可以直接寫(xiě)在后面。
常用的test(未說(shuō)明的均返回True或False):
- defined
- equalto
- escaped
- none
- sequence
- string
- number
- reverse
- replace
- ......
完整的test列表及用法見(jiàn):Template Designer Documentation
Loop(循環(huán))
在一個(gè)for循環(huán)內(nèi),有一些特殊的變量可以使用,這是幾個(gè)常用的:
- loop.index 當(dāng)前迭代數(shù),可以用來(lái)寫(xiě)評(píng)論的樓層數(shù)(從1開(kāi)始)
- loop.index0 同上,不過(guò)從0開(kāi)始迭代
- loop.revindex 反向的迭代數(shù)(基數(shù)為1)
- loop.revindex0 反向的迭代數(shù)(基數(shù)為0)
- loop.length 序列的數(shù)量
- loop.first 是否是第一個(gè)元素
- loop.last 是否是最后一個(gè)元素
- ......
完整的列表見(jiàn):http://jinja.pocoo.org/docs/dev/templates/#for
Whitespace Control(空格控制)
默認(rèn)的設(shè)置:
- 如果末尾有換行符,則去除;
- 其他空格原樣保留。
也就是說(shuō),下面這幾行:
<div>
{% if True %}
yay
{% endif %}
</div>
渲染后的結(jié)果是這樣:
<div>
yay
</div>
Jinja2語(yǔ)句占據(jù)的空行,你自己輸出的空格,Tab都將保留。
如果要去掉Jinja2語(yǔ)句占據(jù)的空行,可以通過(guò)設(shè)置Jinja2的環(huán)境變量實(shí)現(xiàn):
app.jinja_env.trim_blocks = True app.jinja_env.lstrip_blocks = True
或者像這樣手動(dòng)添加一個(gè)減號(hào)(注意和%之間沒(méi)有空格):
<div>
{% if True -%}
yay
{%- endif %}
</div>
兩者實(shí)現(xiàn)的效果相同,如下:
<div>
yay
</div>
如果語(yǔ)句塊的前后都加上減號(hào):
<div>
{%- if True -%}
yay
{%- endif -%}
</div>
渲染后會(huì)是這樣:
<div>yay</div>
通過(guò)Jinja2提供的環(huán)境變量,你可以設(shè)置很多東西,比如分隔符(在和其他的語(yǔ)言產(chǎn)生沖突時(shí),可以通過(guò)修改分隔符來(lái)解決)。具體見(jiàn):http://jinja.pocoo.org/docs/dev/api/#jinja2.Environment
Escaping(轉(zhuǎn)義)
有時(shí)你會(huì)想原樣輸出一些Jinja2語(yǔ)句和分隔符,對(duì)于小的內(nèi)容,可以使用變量表達(dá)式來(lái)輸出,比如輸出一個(gè)分隔符:
{{ '{{' }}
大的內(nèi)容塊可以使用一個(gè)raw塊包裹:
{% raw %}
<ul>
{% for item in seq %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endraw %}
模板繼承
你可以創(chuàng)建一個(gè)base.html作為基模板,把導(dǎo)航欄、頁(yè)腳、flash消息、js或css文件等等需要在每一個(gè)頁(yè)面中顯示的內(nèi)容放在基模板里,并添加一個(gè)空的塊用來(lái)放置其他子模板的內(nèi)容:
{% block content %}{% endblock %}
然后在其他的模板(子模板)里使用這個(gè)extends語(yǔ)句繼承它,并放置相應(yīng)的內(nèi)容到基模板里定義過(guò)的空塊:
{% extends "base.html" %}
{% block content %}
子模板的內(nèi)容
{% endblock %}
如果想添加內(nèi)容到在父模板內(nèi)已經(jīng)定義的塊,可以使用super函數(shù):
{% block sidebar %}
<h3>Table Of Contents</h3>
...
{{ super() }}
{% endblock %}
這樣可以避免覆蓋父塊的內(nèi)容。
全局函數(shù)
常用的全局函數(shù)有:
- range([start, ]stop[, step])
- lipsum(n=5, html=True, min=20, max=100) 為模板生成一些 lorem ipsum。
詳細(xì)列表見(jiàn):Template Designer Documentation
其他內(nèi)容
內(nèi)容還有很多,比如行語(yǔ)句、控制流、表達(dá)式、宏等。不再一一介紹了(寫(xiě)這種介紹文章太累了……)。
具體見(jiàn)文檔的模板部分:
Template Designer Documentation
相關(guān)鏈接
Jinja主頁(yè):Jinja2 Documentation
Jinja2文檔:Jinja2 Documentation
Jinja2文檔模板部分:Template Designer Documentation
Github項(xiàng)目頁(yè):pallets/jinja
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Pandas缺失值填充 df.fillna()的實(shí)現(xiàn)
本文主要介紹了Pandas缺失值填充 df.fillna()的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Gradio機(jī)器學(xué)習(xí)模型快速部署工具應(yīng)用分享前篇
這篇文章主要為大家介紹了Gradio機(jī)器學(xué)習(xí)模型快速部署工具應(yīng)用分享前篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
python實(shí)現(xiàn)selenium網(wǎng)絡(luò)爬蟲(chóng)的方法小結(jié)
這篇文章主要介紹了python實(shí)現(xiàn)selenium網(wǎng)絡(luò)爬蟲(chóng)的方法小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Python解決兩個(gè)整數(shù)相除只得到整數(shù)部分的實(shí)例
今天小編就為大家分享一篇Python解決兩個(gè)整數(shù)相除只得到整數(shù)部分的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
PyQt5創(chuàng)建一個(gè)新窗口的實(shí)例
今天小編就為大家分享一篇PyQt5創(chuàng)建一個(gè)新窗口的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Pytorch 解決自定義子Module .cuda() tensor失敗的問(wèn)題
這篇文章主要介紹了Pytorch 解決自定義子Module .cuda() tensor失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python 字符串與二進(jìn)制串的相互轉(zhuǎn)換示例
今天小編就為大家分享一篇Python 字符串與二進(jìn)制串的相互轉(zhuǎn)換示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07

