• 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. Mac OSX原生读写NTFS功能开启方法

    macOX系统内建的NTFS支持默认只能读不能写 原生读写NTFS,需要自行终端命令手动开启 1. 插上磁盘 此时Mac桌面应该会显示出插入的磁盘,但是当你想把文件拖入磁盘的时候,发现是不能拖进去的, ...

  2. 2019徐州网络赛 I.query

    这题挺有意思哈!!!看别人写的博客,感觉瞬间就懂了. 这道题大概题意就是,给一串序列,我们要查找到l-r区间内,满足min(a[ i ],a[ j ]) = gcd(a[ i ],a[ j ]) 其实 ...

  3. H3C TCP封装

  4. 【codeforces 520A】Pangram

    [题目链接]:http://codeforces.com/problemset/problem/520/A [题意] 给你一个字符串. 统计里面有没有出现所有的英文字母->'a'..'z' 每个 ...

  5. W3C vs IE盒模型

    今年4月份的一次面试,问到盒模型,是我第一次接触到盒模型,但当时不太明白,没有说清楚,后来查了下,但一知半解. 下面分享下,我对盒模型的理解: 盒模型,也就是box-sizing,分为content- ...

  6. Python--day63--图书管理系统表结构设计

    pycharm中运行manage.py的工具: 1,将变更翻译成SQL语句,去数据库中执行(ORM操作过数据库后都要执行这两条命令) 2,ForeignKey会自动在属性后面加_id 3,ORM封装p ...

  7. Python--day48--ORM框架SQLAlchemy操作表

    ORM框架SQLAlchemy操作表: 表结构和数据库连接: #!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy.ext.decl ...

  8. gyp verb check python checking for Python executable "python2" in the PATH

    缺少python2.7支持 可快速使用以下语句完成安装 npm install --global --production windows-build-tools 到时候会自动下载python的 如果 ...

  9. java什么是方法的重载(Overload)

    概念:        在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型或参数顺序不同即可. 存在的原因: 屏蔽了一个对象的同一类方法由于参数不同所造成的差异. 特点: 与返回值 ...

  10. js 制作分页

    如图所示 在html中调用方法 getpage(7, 1, 1, 'URL') 1.page.js文件 代码 function getpage(count, countPage, pageIndex, ...