Flask中间件

一、请求扩展

# 1 before_request
    类比django中间件中的process_request,在请求收到之前绑定一个函数做一些事情 

# 2 after_request
    类比django中间件中的process_response,每一个请求之后绑定一个函数,如果请求没有异常 

#总结
    重点掌握before_request和after_request,

    注意有多个的情况,执行顺序

    before_request请求拦截后(也就是有return值),response所有都执行
from flask import Flask,request

app=Flask(__name__)

@app.before_request
def process():
    request.name='pdun'
    print('请求来的时候')

@app.route('/')
def index():
    print('index----',request.name)    #放的数据,可以取出来
    print('执行程序')
    return 'index'


@app.after_request
def text(response):       #需要带参数
    print('text----', request.name)
    print('请求走的时候')
    return response      #需要返回出去


if __name__ == '__main__':
    app.run()
简单使用
#执行顺序和django中间件相似,来的时候从上往下,走的时候从下往上


from flask import Flask,request

app=Flask(__name__)

@app.before_request
def process():
    request.name='pdun'
    print('请求来的时候111')

@app.before_request
def process():
    request.name='pdun'
    print('请求来的时候222')


@app.route('/')
def index():
    print('执行程序')
    return 'index'


@app.after_request
def text(response):
    print('请求走的时候111')
    return response

@app.after_request
def text(response):
    print('请求走的时候222')
    return response


if __name__ == '__main__':
    app.run()



请求来的时候111
请求来的时候222
执行程序
请求走的时候222
请求走的时候111



--------------------------------------------------------------

如果请求来的时候返回了,请求的执行顺序,与django不同
from flask import Flask,request

app=Flask(__name__)

@app.before_request
def process():
    print('请求来的时候111')
    return 'xxxxxxxxxxx'                #来的时候就返回了,直接走请求走的代码

@app.before_request
def process():
    print('请求来的时候222')


@app.route('/')
def index():
    print('执行程序')
    return 'index'


@app.after_request
def text(response):
    print('请求走的时候111')
    return response

@app.after_request
def text(response):
    print('请求走的时候222')
    return response


if __name__ == '__main__':
    app.run()




请求来的时候111
请求走的时候222
请求走的时候111
执行顺序,请求来的就返回的执行顺序
#3 before_first_request
    服务一启动,第一次请求会走,以后再也不走了

#4 teardown_request 
    无论是否出现异常,都会执行

#5 errorhandler
    @app.errorhandler(404)       #可以写状态吗
    def error_404(arg):
        return "404错误了"

#6 template_global            标签
    @app.template_global()
    def add(a1, a2):
        return a1 + a2
    #{{add(1,2)}}           #视图函数(执行程序)不需要传return add,模板层直接可以用

#7 template_filter          过滤器
    @app.template_filter()
    def db(a1, a2, a3):
        return a1 + a2 + a3
    #{{ 1|db(2,3)}}           #与django不同,可以传多个参数 (django只支持传两个)
    
原文地址:https://www.cnblogs.com/pdun/p/11204883.html