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

flask的url处理器(url_defaults和url_value_preprocessor)的更多相关文章

  1. Django和Flask对于URL尾斜杠(back slash)的处理

    最近在看Flask,其中提到了对于URL尾斜杠的处理.感觉算是一个需要注意的地方吧,就和Django的处理方式来进行一个简单的对比. 首先说下什么是尾斜杠. http://www.baidu.com/ ...

  2. flask之URL和视图(一)

    1.Flask URL和视图 1.1.第一个flask程序 from flask import Flask #创建一个Flask对象,传递__name__参数进去 app = Flask(__name ...

  3. flask笔记---url、变量规则

    1.路由: route() 装饰器用于把一个函数绑定到一个 URL,可以动态变化 URL 的某些部分,还可以为一个函数指定多个规则,从而方便用户访问与记忆. 例子: @app.route('/') # ...

  4. flask 对URL进行安全验证

    对URL进行安全验证 虽然我们已经实现了重定向会上一个页面的功能,但是安全问题不容忽视,鉴于referer和next容易被串篡改的特性,我们需要对这些值进行验证,否则会形成开放重定向漏洞   以URL ...

  5. 【Python】Flask系列-URL和视图笔记

    1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...

  6. 使Flask的url支持正则表达式以及一个api小demo

    from flask import Flask from flask import jsonify from flask import request from werkzeug.routing im ...

  7. Flask学习 url和视图

    因为扫描器的准备使用Flask框架,所以开始恶补Flask和前后端的知识 Flask是一个使用Python编写的轻量级Web应用框架,作者是 Armin Ronacher(他也是 Werkzeug 及 ...

  8. flask动态url规则

    动态URL规则 URL规则可以添加变量部分,也就是件更符合同规则的URL抽象成一个URL模式. @app.route('/item/<id>') def item(id): return ...

  9. flask学习(三):flask入门(URL)

    一. flask简介 flask是一款非常流行的python web框架,出生于2010年,作者是Armin Ronacher,本来这个项目只是作者在愚人节的一个玩笑,后来由于非常受欢迎,进而成为一个 ...

随机推荐

  1. Linux Mint 19.1 安装 Docker 过程笔记

    Linux Mint 19.1 安装 Docker 过程笔记 参考了很多教程,可能有很多教程已经过时. 综合记录一下. 首先修改一下系统的源,使用国内的源. 然后安装 docker sudo apt ...

  2. Flask学习之十三 日期和时间

    英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiii-dates-and-times 中文翻译地址: ...

  3. Datamation Index

    Datamation Index     Understand how to handle big data and improve organizational agility to support ...

  4. Project Euler Problem 12-Highly divisible triangular number

    最直接的想法就是暴力搞搞,直接枚举,暴力分解因子.再好一点,就打个素数表来分解因子.假设num=p1^a1p2^a2...pn^an,则所有因子个数为(a1+1)(a2+1)...(an+1). 再好 ...

  5. hdu 4063 Aircraft (Geometry + SP)

    Problem - 4063 几何加简单最短路. 题意是给出若干圆的圆心以及半径,求出从给出的起点到终点的最短路径的长度,可以移动的区域是圆覆盖到的任意一个位置. 做法是这样的,对圆两两求交点,用这些 ...

  6. clear简单的例子

    非常实用,非常简单的例子,结果都在图片里 <html> <head> <style> .keepbj { width:800px; height: 300px; b ...

  7. torch.optim优化算法理解之optim.Adam()

    torch.optim是一个实现了多种优化算法的包,大多数通用的方法都已支持,提供了丰富的接口调用,未来更多精炼的优化算法也将整合进来. 为了使用torch.optim,需先构造一个优化器对象Opti ...

  8. 2018-6-24-WPF-使用RPC调用其他进程

    title author date CreateTime categories WPF 使用RPC调用其他进程 lindexi 2018-06-24 14:41:29 +0800 2018-2-13 ...

  9. 微信小程序wx.request POST获取不到数据解决办法

    get //发起请求     wx.request({       url: 'http://www.xiaochengxu.com/home/index/curd', //仅为示例,并非真实的接口地 ...

  10. 简单的Spring Batch示例

    使用Spring Batch做为批处理框架,可以完成常规的数据量不是特别大的离线计算. 现在写一个简单的入门版示例. 这里默认大家已经掌握了Spring Batch的基本知识,示例只是为了快速上手实践 ...