### 导航
- [索引](# "总目录")
- [下一页](# "部署和分发") |
- [上一页](# "应用调度") |
- [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
- 许可证
- 术语表