• 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. idea java内存分析工具

    https://blog.csdn.net/qq_22194659/article/details/83829891 https://www.ej-technologies.com/products/ ...

  2. WPF 线段Line过长渲染出现的问题

    原文:WPF 线段Line过长渲染出现的问题 在使用WPF的时候,可以做一个实验,在canvas里添加一条线段Line,StrokeThickness属性设置为1,然后通过放大canvas或者调整li ...

  3. golang micro client 报错500 {"id":"go.micro.client","code":408,"detail":"call timeout: context deadline exceeded","status":"Request Timeout"}

    go micro web端连接services时,第一次访问提示500(broken pipe),排查发现客户端请求services时返回 {"id":"go.micro ...

  4. Libev源码分析05:Libev中的绝对时间定时器

    Libev中的超时监视器ev_periodic,是绝对时间定时器,不同于ev_timer,它是基于日历时间的.比如如果指定一个ev_periodic在10秒之后触发(ev_now() + 10),然后 ...

  5. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

  6. oracle不明确的索引等级

    当ORACLE无法判断索引的等级高低差别,优化器将只使用一个索引,它就是在WHERE子句中被列在最前面的. 举例: DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. SELECT ...

  7. git 生成秘钥连接远程仓库

    二.打开GitBash ,用cd命令进入本地项目目,然后把初始化一下,把本地的目录变成git本地仓库, git status 可以查看本地目录的状态信息 git init git status 三.将 ...

  8. GPU版TensorFlow怎么指定让CPU运行

    由于某些原因GPU版的TensorFlow运行起来会出现一些问题,比如内存溢出等情况.此时我们可以用CPU和系统内存来运行我们的程序. 代码如下: import osos.environ[" ...

  9. WPF 之 DataTemplate 实例(摘抄)

     

  10. Python--day26--面向对象思维导图