### 導航
- [索引](# "總目錄")
- [下一頁](# "部署和分發") |
- [上一頁](# "應用調度") |
- [Flask 0.10.1 文檔](#) ?
- [Flask 代碼模式](#) ?
# 使用 URL 處理器
0.7 新版功能.
Flask 0.7 版引入了 URL 處理器的概念。此概念的意義在于,對于一部分資源,您并不是很清楚該如何設定其 URL 相同的部分。例如可能有一些 URL 包含了幾個字母來指定的多國語言語種,但是你不想在每個函數里都手動識別到底是哪個語言。
搭配 Blueprint 使用時,URL 處理器尤其有用。這里我們將會就具體的應用例子介紹如何使用URL 處理器和 Blueprint
### 國際化的應用程序 URL
試想如下一個網頁應用:
~~~
from flask import Flask, g
app = Flask(__name__)
@app.route('/<lang_code>/')
def index(lang_code):
g.lang_code = lang_code
...
@app.route('/<lang_code>/about')
def about(lang_code):
g.lang_code = lang_code
...
~~~
這可能會產生一大片重復的代碼,因為你必須在每個函數當中手動處理 [g](# "flask.g") 對象。當然,你可以使用裝飾器來簡化它,但想要從一個函數動態生成 URL 到另一個函數,仍需詳細地提供這段多國語言代號碼,這將非常地惱人。
對于后者,這就是 [url_defaults()](# "flask.Flask.url_defaults") 函數大展神威的地方了!這些函數可以自動地將值注入到 [url_for()](# "flask.url_for") 的調用中去。下面的代碼檢查多語言代號碼是否在包含各個 URL 值的字典里,以及末端調用的函數是否接受'lang_code'
~~~
@app.url_defaults
def add_language_code(endpoint, values):
if 'lang_code' in values or not g.lang_code:
return
if app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
values['lang_code'] = g.lang_code
~~~
URL 映射的函數 [is_endpoint_expecting()](http://werkzeug.pocoo.org/docs/routing/#werkzeug.routing.Map.is_endpoint_expecting "(在 Werkzeug v0.10)") [http://werkzeug.pocoo.org/docs/routing/#werkzeug.routing.Map.is_endpoint_expecting] 可以被用來識別是否可以給末端的函數提供一個多國語言代號碼。
相反的函數是 url_value_preprocessor() 。他們在請求成功匹配并且能夠執行針對 URL 值的代碼時立即執行。實際上,他們將信息從包含這些值的字典當中取出,然后將其放在某個其他的地方:
~~~
@app.url_value_preprocessor
def pull_lang_code(endpoint, values):
g.lang_code = values.pop('lang_code', None)
~~~
這樣,您再也不必在每個函數中都要將 lang_code 分配給 [g](# "flask.g") 了。您可以進一步的改進它,通過編寫您自己的裝飾器,并使用這些裝飾器為包含多國語言代號碼的 URL 添加前綴。但是使用藍圖相比起來會更優雅一些。一旦 'lang_code'被從字典里彈出,他就不會在被傳遞到視圖函數當中。這樣,代碼就可簡化為如下形式:
~~~
from flask import Flask, g
app = Flask(__name__)
@app.url_defaults
def add_language_code(endpoint, values):
if 'lang_code' in values or not g.lang_code:
return
if app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
values['lang_code'] = g.lang_code
@app.url_value_preprocessor
def pull_lang_code(endpoint, values):
g.lang_code = values.pop('lang_code', None)
@app.route('/<lang_code>/')
def index():
...
@app.route('/<lang_code>/about')
def about():
...
~~~
### 多國語言化的 Blueprint URL
因為 Blueprint 能夠自動地為所有 URL 添加一個相同的字符串作為前綴,所以自動處理這些函數變得非常簡單。每個藍圖都可以有一個 URL 處理器,即從 [url_defaults()](# "flask.Flask.url_defaults") 函數中移除一整套業務邏輯,因為它不再檢查URL 是否真正與 'lang_code' 相關:
~~~
from flask import Blueprint, g
bp = Blueprint('frontend', __name__, url_prefix='/<lang_code>')
@bp.url_defaults
def add_language_code(endpoint, values):
values.setdefault('lang_code', g.lang_code)
@bp.url_value_preprocessor
def pull_lang_code(endpoint, values):
g.lang_code = values.pop('lang_code')
@bp.route('/')
def index():
...
@bp.route('/about')
def about():
...
~~~
? 版權所有 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
- 許可證
- 術語表