Flask 使用 Jinja2 作為默認模板引擎。你完全可以使用其它模板引擎。但是不管你使用 哪種模板引擎,都必須安裝 Jinja2 。因為使用 Jinja2 可以讓 Flask 使用更多依賴于 這個模板引擎的擴展。
本文只是簡單介紹如何在 Flask 中使用 Jinja2 。如果要詳細了解這個模板引擎的語法, 請查閱 Jinja2 模板官方文檔 。
在 Flask 中, Jinja2 默認配置如下:
缺省情況下,以下全局變量可以在 Jinja2 模板中使用:
config 當前配置對象 ( flask.config )
New in version 0.6.
Changed in version 0.10: 此版本開始,這個變量總是可用,甚至是在被導入的模板中。
request 當前請求對象 ( flask.request )。在沒有活動請求環(huán)境情況下渲染模塊 時,這個變量不可用。
session 當前會話對象 ( flask.session )。在沒有活動請求環(huán)境情況下渲染模塊 時,這個變量不可用。
g 請求綁定的全局變量 ( flask.g )。在沒有活動請求環(huán)境情況下渲染模塊 時,這個變量不可用。
url_for() flask.url_for() 函數(shù)。
get_flashed_messages() flask.get_flashed_messages() 函數(shù)。
這些添加到環(huán)境中的變量不是全局變量。與真正的全局變量不同的是這些變量在已導入 的模板的環(huán)境中是不可見的。這樣做是基于性能的原因,同時也考慮讓代碼更有條理。
那么對你來說又有什么意義呢?假設你需要導入一個宏,這個宏需要訪問請求對象, 那么你有兩個選擇:
導入方式如下:
{% from '_helpers.html' import my_macro with context %}
在 Flask 中的模板中添加了以下 Jinja2 本身沒有的過濾器:
tojson()
這個函數(shù)可以把對象轉(zhuǎn)換為 JSON 格式。如果你要動態(tài)生成 JavaScript ,那么這個函數(shù)非常有用。
注意,在 script 標記內(nèi)部不能轉(zhuǎn)義,因此在 Flask 0.10 之前的版本中,如果要在 script 標記內(nèi)部使用這個函數(shù)必須用 |safe 關閉轉(zhuǎn)義:
<script type=text/javascript>
doSomethingWith({{ user.username|tojson|safe }});
</script>
自動轉(zhuǎn)義是指自動對特殊字符進行轉(zhuǎn)義。特殊字符是指 HTML ( 或 XML 和 XHTML )中的 & 、 > 、 < 、 " 和 ' 。因為這些特殊字符代表了特殊的意思, 所以如果要在文本中使用它們就必須把它們替換為“實體”。如果不轉(zhuǎn)義,那么用戶就 無法使用這些字符,而且還會帶來安全問題。(參見跨站腳本攻擊(XSS) )
有時候,如需要直接把 HTML 植入頁面的時候,可能會需要在模板中關閉自動轉(zhuǎn)義功能。這個可以直接植入的 HTML 一般來自安全的來源,例如一個把標記語言轉(zhuǎn)換為 HTML 的轉(zhuǎn)換器。
有三種方法可以控制自動轉(zhuǎn)義:
在模板中關閉自動轉(zhuǎn)義系統(tǒng)可以使用 {% autoescape %} 塊:
{% autoescape false %}
<p>autoescaping is disabled here
<p>{{ will_not_be_escaped }}
{% endautoescape %}
在這樣做的時候,要非常小心塊中的變量的安全性。
有兩種方法可以在 Jinja2 中注冊你自己的過濾器。要么手動把它們放入應用的 jinja_env 中,要么使用 template_filter() 裝飾器。
下面兩個例子功能相同,都是倒序一個對象:
@app.template_filter('reverse')
def reverse_filter(s):
return s[::-1]
def reverse_filter(s):
return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
裝飾器的參數(shù)是可選的,如果不給出就使用函數(shù)名作為過濾器名。一旦注冊完成后,你就可以在模板中像 Jinja2 的內(nèi)建過濾器一樣使用過濾器了。例如,假設在環(huán)境中你有一個名為 mylist 的 Pyhton 列表:
{% for x in mylist | reverse %}
{% endfor %}
環(huán)境處理器的作用是把新的變量自動引入模板環(huán)境中。環(huán)境處理器在模板被渲染前運行, 因此可以把新的變量自動引入模板環(huán)境中。它是一個函數(shù),返回值是一個字典。在應用的所有模板中,這個字典將與模板環(huán)境合并:
@app.context_processor
def inject_user():
return dict(user=g.user)
上例中的環(huán)境處理器創(chuàng)建了一個值為 g.user 的 user 變量,并把這個變量加入了 模板環(huán)境中。這個例子只是用于說明工作原理,不是非常有用,因為在模板中, g 總是存在的。
傳遞值不僅僅局限于變量,還可以傳遞函數(shù)( Python 提供傳遞函數(shù)的功能):
@app.context_processor
def utility_processor():
def format_price(amount, currency=u'€'):
return u'{0:.2f}{1}'.format(amount, currency)
return dict(format_price=format_price)
上例中的環(huán)境處理器把 format_price 函數(shù)傳遞給了所有模板:
{{ format_price(0.33) }}
你還可以把 format_price 創(chuàng)建為一個模板過濾器(參見注冊過濾器 ),這里只是演示如何在一個環(huán)境處理器中傳遞函數(shù)。
? Copyright 2013, Armin Ronacher. Created using Sphinx.