• 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. oralce CUBE

    select id,area,stu_type,sum(score) score from students group by cube(id,area,stu_type) order by id,a ...

  2. Android系列之Android 命令行手动编译打包详解

    Android 命令行手动编译打包过程图 [详细步骤]: 1使用aapt生成R.java类文件:  例:  E:\androidDev\android-sdk-windows2.2\tools> ...

  3. P2993 [FJOI2014]最短路径树问题 点分治+最短路

    这道题还是非常简单的,由于我们要保证最小字典序,因此我们需要把边进行排序,然后从大到小插入,因为链式前向星是倒着存的.我们只需要先跑一个最短路,然后查询边是不是在最短路上,这个可以通过枚举边并用 di ...

  4. Wood Processing牛客第十场 斜率优化DP

    卧槽我感觉写的是对的,但是就是样例都过不了...留坑 #include<iostream> #include<stdio.h> #include<string.h> ...

  5. Chrome接口请求一直是pending状态,但接口实际上是正常的

    1.现象 个别机器突然出现Chrome访问我司产品异常,本该通过接口获取的数据没有呈现,之前都是好好的,而且其他机器同样用同版本Chrome访问正常. 出现问题的机器重装Chrome问题依然存在,直到 ...

  6. g++ 编译单个文件和多个文件

    转载:https://www.cnblogs.com/battlescars/p/cpp_linux_gcc.html 1.单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp ...

  7. HMM(隐马尔科夫)用于中文分词

    隐马尔可夫模型(Hidden Markov Model,HMM)是用来描述一个含有隐含未知参数的马尔可夫过程. 本文阅读了2篇blog,理解其中的意思,附上自己的代码,共同学习. 一.理解隐马尔科夫 ...

  8. Java反射机制(三):调用对象的私有属性和方法

    一. 通过反射调用类中的方法 在正常情况下,得到类的对象后,我们就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚地知道要调用的方法是什么,之后通过Class类中的getMethod方法,可 ...

  9. Python--day69--单表查询之神奇的双下划线

    单表查询之神奇的双下划线: 单表查询之神奇的双下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 models. ...

  10. 2007年NOIP普及组复赛题解

    题目涉及算法: 奖学金:结构体排序: 纪念品分组:贪心: 守望者的逃离:动态规划: Hanoi 双塔问题:递推. 奖学金 题目链接:https://www.luogu.org/problem/P109 ...