### 導航
- [索引](# "總目錄")
- [下一頁](# "測試 Flask 應用") |
- [上一頁](# "福利: 應用測試") |
- [Flask 0.10.1 文檔](#) ?
# 模板
Flask 使用 Jinja 2 作為模板引擎。當然,你也可以自由使用其它的模板引擎,但運行Flask 本身仍然需要 Jinja2 依賴 ,這對啟用富擴展是必要的,擴展可以依賴 Jinja2 存在。
本節只是快速地介紹 Jinja2 是如何集成到 Flask 中的。更多關于 Jinja2 語法本身的信息,請參考官方文檔[Jinja2 模板引擎](http://jinja.pocoo.org/2/documentation/templates) [http://jinja.pocoo.org/2/documentation/templates] 。
### Jinja 配置
Jinja 2 默認配置如下:
- 所有擴展名為 .html 、 .htm 、 .xml 以及 .xhtml的模板會開啟自動轉義
- 模板可以利用 {%autoescape%} 標簽選擇自動轉義的開關。
- Flask 在 Jinja2 上下文中插入了幾個全局函數和助手,另外還有一些目前默認的值
### 標準上下文
下面的全局變量默認在 Jinja2 模板中可用:
config
當前的配置對象 (flask.config)
0.6 新版功能.
在 0.10 版更改: 現在這總是可用的,甚至在導入的模版里。
request
當前的請求對象 ([flask.request](# "flask.request"))。當模版不是在活動的請求上下文中渲染時這個變量不可用。
session
當前的會話對象 ([flask.session](# "flask.session"))。當模版不是在活動的請求上下文中渲染時這個變量不可用。
g
請求相關的全局變量 ([flask.g](# "flask.g"))。當模版不是在活動的請求上下文中渲染時這個變量不可用。
url_for()
[flask.url_for()](# "flask.url_for") 函數
get_flashed_messages()
[flask.get_flashed_messages()](# "flask.get_flashed_messages") 函數
Jinja 上下文行為
這些變量被添加到了請求的上下文中,而非全局變量。區別在于,他們默認不會在導入模板的上下文中出現。這樣做,一方面是考慮到性能,另一方面是為了讓事情顯式透明。
這對你來說意味著什么?如果你想要導入一個需要訪問請求對象的宏,有兩種可能的方法:
1. 顯式地傳入請求或請求對象的屬性作為宏的參數。
1. 與上下文一起(with context)導入宏。
與上下文中一起(with context)導入的方式如下:
~~~
{% from '_helpers.html' import my_macro with context %}
~~~
### 標準過濾器
這些過濾器在 Jinja2 中可用,也是 Jinja2 自帶的過濾器:
tojson()
這個函數把給定的對象轉換為 JSON 表示,如果你要動態生成 JavaScript 這里有一個非常有用的例子。
注意 script 標簽里的東西不應該被轉義,因此如果你想在 script 標簽里使用它,請使用 |safe 來禁用轉義,:
~~~
<script type=text/javascript>
doSomethingWith({{ user.username|tojson|safe }});
</script>
~~~
### 控制自動轉義
自動轉義的概念是自動轉義特殊字符。 HTML (或 XML ,因此也有 XHTML )意義下的特殊字符是 & , > , < , " 以及 ' 。因為這些字符在文檔中表示它們特定的含義,如果你想在文本中使用它們,應該把它們替換成相應的“實體”。不這么做不僅會導致用戶疲于在文本中使用這些字符,也會導致安全問題。(見 [*跨站腳本攻擊(XSS)*](#) )
雖然你有時會需要在模板中禁用自動轉義,比如在頁面中顯式地插入 HTML ,可以是一個來自于 markdown 到 HTML 轉換器的安全輸出。
我們有三種可行的解決方案:
- 在傳遞到模板之前,用 [Markup](# "flask.Markup") 對象封裝 HTML字符串。一般推薦這個方法。
- 在模板中,使用 |safe 過濾器顯式地標記一個字符串為安全的 HTML( {{myvariable|safe}} )。
- 臨時地完全禁用自動轉義系統。
在模板中禁用自動轉義系統,可以使用 {%autoescape%} 塊:
~~~
{% autoescape false %}
<p>autoescaping is disabled here
<p>{{ will_not_be_escaped }}
{% endautoescape %}
~~~
無論何時,都請務必格外小心這里的變量。
### 注冊過濾器
如果你要在 Jinja2 中注冊你自己的過濾器,你有兩種方法。你可以把它們手動添加到應用的 [jinja_env](# "flask.Flask.jinja_env") 或者使用[template_filter()](# "flask.Flask.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
~~~
在使用裝飾器的情況下,如果你想以函數名作為過濾器名,參數是可選的。注冊之后,你可以在模板中像使用 Jinja2 內置過濾器一樣使用你的過濾器,例如你在上下文中有一個名為 mylist 的 Python 列表:
~~~
{% for x in mylist | reverse %}
{% endfor %}
~~~
### 上下文處理器
Flask 上下文處理器自動向模板的上下文中插入新變量。上下文處理器在模板渲染之前運行,并且可以在模板上下文中插入新值。上下文處理器是一個返回字典的函數,這個字典的鍵值最終將傳入應用中所有模板的上下文:
~~~
@app.context_processor
def inject_user():
return dict(user=g.user)
~~~
上面的上下文處理器使得模板可以使用一個名為 user ,值為 g.user 的變量。不過這個例子不是很有意思,因為 g 在模板中本來就是可用的,但它解釋了上下文處理器是如何工作的。
變量不僅限于值,上下文處理器也可以使某個函數在模板中可用(由于 Python 允許傳遞函數):
~~~
@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)
~~~
上面的上下文處理器使得 format_price 函數在所有模板中可用:
~~~
{{ format_price(0.33) }}
~~~
你也可以構建 format_price 為一個模板過濾器(見 [*注冊過濾器*](#) ),但這展示了上下文處理器傳遞函數的工作過程。
? 版權所有 2013, Armin Ronacher.
- 歡迎使用 Flask
- 前言
- 給有經驗程序員的前言
- 安裝
- 快速入門
- 教程
- 介紹 Flaskr
- 步驟 0: 創建文件夾
- 步驟 1: 數據庫模式
- 步驟 2: 應用設置代碼
- 步驟 3: 創建數據庫
- 步驟 4: 請求數據庫連接
- 步驟 5: 視圖函數
- 步驟 6: 模板
- 步驟 7: 添加樣式
- 福利: 應用測試
- 模板
- 測試 Flask 應用
- 記錄應用錯誤
- 配置處理
- 信號
- 即插視圖
- 應用上下文
- 請求上下文
- 用藍圖實現模塊化的應用
- Flask 擴展
- 與 Shell 共舞
- Flask 代碼模式
- 大型應用
- 應用程序的工廠函數
- 應用調度
- 使用 URL 處理器
- 部署和分發
- 使用 Fabric 部署
- 在 Flask 中使用 SQLite 3
- 在 Flask 中使用 SQLAlchemy
- 上傳文件
- 緩存
- 視圖裝飾器
- 使用 WTForms 進行表單驗證
- 模板繼承
- 消息閃現
- 用 jQuery 實現 Ajax
- 自定義錯誤頁面
- 延遲加載視圖
- 在 Flask 中使用 MongoKit
- 添加 Favicon
- 數據流
- 延遲請求回調
- 添加 HTTP Method Overrides
- 請求內容校驗碼
- 基于 Celery 的后臺任務
- 部署選擇
- mod_wsgi (Apache)
- 獨立 WSGI 容器
- uWSGI
- FastCGI
- CGI
- 聚沙成塔
- API
- JSON 支持
- Flask 中的設計決策
- HTML/XHTML 常見問題
- 安全注意事項
- Flask 中的 Unicode
- Flask 擴展開發
- Pocoo 風格指引
- Python 3 支持
- 升級到最新版本
- Flask Changelog
- 許可證
- 術語表