• url处理器的作用:对于一部分资源, 你并不是很清楚该如何设定其 URL 相同的部分。例如可能有一些URL包含了几个字母来指定的多国语言语种,但是你不想在每个函数里都手动识别到底是哪个语言
rom flask import Flask, g

app = Flask(__name__)

@app.route('/<lang_code>/')
def index(lang_code):
g.lang_code = lang_code #你必须在每个函数当中手动处理g对象,这可能会产生一大片重复的代码
... @app.route('/<lang_code>/about')
def about(lang_code):
g.lang_code = lang_code # 重复代码
...
  • url_value_preprocessor() 。该方法在请求(request)匹配成功立马执行,执行的代码基于URL传递的values。实际上,他们将信息从包含这些值的字典当中取出,然后将其放在某个其他的地方

    @app.url_value_preprocessor
    def pull_lang_code(endpoint, values):
    g.lang_code = values.pop('lang_code', None)
  • 简化后的代码如下:

from flask import Flask, g

app = Flask(__name__)

@app.url_value_preprocessor
def pull_lang_code(endpoint, values):
'''
在处理第一次有lang_code参数的请求的时候,把g.lang_code设为用户需要的语言,后续的函数则不需要编写重复的代码了
'''
g.lang_code = values.pop('lang_code', None) @app.route('/<lang_code>/')
def index():
... @app.route('/<lang_code>/about')
def about():
...
  • 这样,您再也不必在每个函数中都要将 lang_code 分配给 g 了。 一旦lang_code被从字典里弹出,他就不会在被传递到视图函数当中。

  • 但是,若使url_for来生成URL,会出现参数不足的错误,这是因为pull_lang_codelang_code弹出了,url_for工作时需要使用这个值,但是这个时候这个值找不到了,因此我们要把lang_code值重新压入

  • 使用url_defaults装饰器的函数可以自动地将值注入到url_for()的调用中去

    @app.url_defaults
    def add_language_code(endpoint, values): # 将lang_code值重新压入
    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.route('/<lang_code>/')
    def index(lang_code):
    pass url_for("index",lang_code='Zh')
    # 此时会调用add_language_code(endpoint, values)函数
    # endpoint就是函数名index
    # values是包括url_for函数所有后面参数的dict,添加values的值,用于生成url
  • is_endpoint_expecting()用于找出往endpoint函数传递该参数是否有意义,在这个例子中,就是用来测试index函数是否需要’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 添加一个相同的字符串作为前缀,所以自动处理这些函数变得非常简单。 每个蓝图都可以有一个 URL 处理器,因为不必检查lang_code参数,所以url_defaults可以简化为如下所示:

    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():
    ...

最新文章

  1. JavaScript动画-磁性吸附
  2. jquery plugins
  3. 函数lock_mode_stronger_or_eq 锁权限等级
  4. 音频播放AVFoundation框架
  5. GET请求和POST请求
  6. 虚拟局域网(VLAN)组态
  7. CSS移动
  8. 【JAVAWEB学习笔记】11_XML&amp;反射
  9. 《深入浅出node.js(朴灵)》【PDF】下载
  10. 为什么arguments是类数组对象
  11. 【机器学习学习】SKlearn + XGBoost 预测 Titanic 乘客幸存
  12. zabbix监控的基础概念、工作原理及架构
  13. Java进阶(十二)JDK版本错误之Unsupported major.minor version 51.0(jdk版本错误)
  14. ABP学习笔记总汇
  15. .NET提供了三种后台输出js的方式:
  16. Hiberbate注解
  17. 轻松学C#----第二篇笔记
  18. Java编写准备数据源
  19. Pandas新建一个DataFrame
  20. VMware Station NAT上网模式配置

热门文章

  1. poj 1845 【数论:逆元,二分(乘法),拓展欧几里得,费马小定理】
  2. Kubernetes弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源
  3. H3C路由器Telnet服务配置命令
  4. Node.js 安装第三方模块包(npm),通过 package.json配置信息安装项目依赖的模块
  5. python-字符编码数据类型转换
  6. H3C DCC的特点
  7. js 数组的拼接
  8. jq杂项方法/工具方法----trim() html() val() text() attr()
  9. Python--day40--全局解释器锁
  10. Codeforces Round #183 (Div. 2)