您好,登錄后才能下訂單哦!
Jinja是組成Flask的模板引擎。可能你還不太了解它是干嘛的,但你對下面這些百分號和大括號肯定不陌生:
{% block body %} <ul> {% for user in users %} <li><a href="{{ user.url }}" rel="external nofollow" >{{ user.username }}</a></li> {% endfor %} </ul> {% endblock %}
看過《Flask Web開發》,很多人都能寫出來這些,但除了書里講的,你還應該了解一些其他的語法細節。這篇文章就來介紹一些常用的語法和函數,如果想要系統完整的了解Jinja,可以去讀它的文檔:Jinja2 Documentation。
FAQ
在Jinja網站上的FAQ里,我挑了三個大家可能會比較感興趣的問題(簡單翻譯了一下)。
1、為什么要叫Jinja?
之所以叫Jinja,是因為日本的神社(Jinja)英文單詞是temple,而模板的英文是template,兩者發音很相似(這么說來,它本來也有可能叫Miao的……)。
2、Jinja的速度怎么樣?
和Mako差不多,但比Genshi以及Django的模板引擎快10~20倍。
3、把邏輯判斷(Logic)放到模板里是個好主意嗎?
毫無疑問,你放到模板里邏輯判斷(Logic)應該越少越好。但為了讓大家都開心,適當的邏輯判斷是需要的。盡管如此,它有很多對于你能做什么,不能做什么的限制。
出于諸多考慮(速度,易讀性等等),Jinja既不允許你放置任意的Python代碼,也不允許所有的Python表達式。這也是為什么我們要了解Jinja2的語法。
Delimiters(分隔符)
{% ... %} 語句(Statements)
{{ ... }} 打印模板輸出的表達式(Expressions)
{# ... #} 注釋
# ... ## 行語句(Line Statements)
多說一下注釋,這是單行注釋:
{#% for user in users %#}
下面是多行注釋:
{# note: commented-out template because we no longer use this {% for user in users %} ... {% endfor %} #}
Variables(變量)
除了普通的字符串變量,Jinja2還支持列表、字典和對象,你可以這樣獲取變量值:
{{ mydict['key'] }} {{ mylist[3] }} {{ mylist[myintvar] }} {{ myobj.somemethod() }}
獲取一個變量的屬性有兩種方式:
{{ foo.bar }} {{ foo['bar'] }}
這兩種方法基本相同(深層次的區別可以暫不考慮)
Filter(過濾器)
過濾器用來修改變量,使用一個豎線和變量相隔。
{{ items|join(', ') }}
常用的內置過濾器:
{{ my_variable|default('my_variable is not defined') }}
完整的fliter列表:http://jinja.pocoo.org/docs/dev/templates/#builtin-filters
Tests(測試,判斷)
Jinja2提供的tests可以用來在語句里對變量或表達式進行測試,如果要測試一個變量,可以在變量后加上“is”和test名,比如:
{% if user.age is equalto 42 %} {# 這里也可以寫成... is equalto(42) #} Ha, you are 42! {% endif %}
如果要傳入參數,可以在test后增加括號,也可以直接寫在后面。
常用的test(未說明的均返回True或False):
完整的test列表及用法見:Template Designer Documentation
Loop(循環)
在一個for循環內,有一些特殊的變量可以使用,這是幾個常用的:
完整的列表見:http://jinja.pocoo.org/docs/dev/templates/#for
Whitespace Control(空格控制)
默認的設置:
也就是說,下面這幾行:
<div> {% if True %} yay {% endif %} </div>
渲染后的結果是這樣:
<div> yay </div>
Jinja2語句占據的空行,你自己輸出的空格,Tab都將保留。
如果要去掉Jinja2語句占據的空行,可以通過設置Jinja2的環境變量實現:
app.jinja_env.trim_blocks = True app.jinja_env.lstrip_blocks = True
或者像這樣手動添加一個減號(注意和%之間沒有空格):
<div> {% if True -%} yay {%- endif %} </div>
兩者實現的效果相同,如下:
<div> yay </div>
如果語句塊的前后都加上減號:
<div> {%- if True -%} yay {%- endif -%} </div>
渲染后會是這樣:
<div>yay</div>
通過Jinja2提供的環境變量,你可以設置很多東西,比如分隔符(在和其他的語言產生沖突時,可以通過修改分隔符來解決)。具體見:http://jinja.pocoo.org/docs/dev/api/#jinja2.Environment
Escaping(轉義)
有時你會想原樣輸出一些Jinja2語句和分隔符,對于小的內容,可以使用變量表達式來輸出,比如輸出一個分隔符:
{{ '{{' }}
大的內容塊可以使用一個raw塊包裹:
{% raw %} <ul> {% for item in seq %} <li>{{ item }}</li> {% endfor %} </ul> {% endraw %}
模板繼承
你可以創建一個base.html作為基模板,把導航欄、頁腳、flash消息、js或css文件等等需要在每一個頁面中顯示的內容放在基模板里,并添加一個空的塊用來放置其他子模板的內容:
{% block content %}{% endblock %}
然后在其他的模板(子模板)里使用這個extends語句繼承它,并放置相應的內容到基模板里定義過的空塊:
{% extends "base.html" %} {% block content %} 子模板的內容
{% endblock %}
如果想添加內容到在父模板內已經定義的塊,可以使用super函數:
{% block sidebar %} <h4>Table Of Contents</h4> ... {{ super() }} {% endblock %}
這樣可以避免覆蓋父塊的內容。
全局函數
常用的全局函數有:
詳細列表見:Template Designer Documentation
其他內容
內容還有很多,比如行語句、控制流、表達式、宏等。不再一一介紹了(寫這種介紹文章太累了……)。
具體見文檔的模板部分:
Template Designer Documentation
相關鏈接
Jinja主頁:Jinja2 Documentation
Jinja2文檔:Jinja2 Documentation
Jinja2文檔模板部分:Template Designer Documentation
Github項目頁:pallets/jinja
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。