flask 中间件

  • Post author:
  • Post category:其他


自定义局部中间件

根据装饰器

from functools import wraps


def auth(func):
    @wraps(func)
    def inner(*args, **kwargs):
        if not session.get('user'):
            return redirect(url_for('login'))
        ret = func(*args, **kwargs)
        return ret
    return inner

@app.route('/login', methods=["GET", "POST"])
@auth
def login():

自定义全局装饰器

写在app.py中

class Middleware(object):
    
    def __init__(self, old):
        self.old = old
    
    def __call__(self, *args, **kwargs):
        print('请求前的操作')
        ret = self.old(*args, **kwargs)  
        print('请求之后操作')
        return ret


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

自带的全局装饰器before_request

有返回值,就地返回,不执行视图。  不写返回值(return),或者return None,再执行视图

@app.before_request
def xxx():
    if request.path == '/login':
        return None       # return None 接着执行视图 有返回值就地返回
        # 或者 return
    if request.form.get('user'):
        return None
    return redirect('/login')

自带的全局装饰器after_request

必须有返回值

@app.after_request
def x2(response):    # 必须有response
    print('after')
    return response 

几个中间件的执行顺序

@app.before_request
def x1():
   print('before')

@app.after_request
def x2(response):    # 必须有response
    print('after')
    return response 

@app.route('/index/')
def index():
   print('index')
   return "index"

执行打印结果
before
index
after

不多说上图

mm图画错了, request4要改为response4

就是说flask的中间件request1有返回值,不执行后面的request中间件,不执行视图函数。直接执行其余的response中间件

而django的request1有返回值也是不执行其他的request和视图函数, 不过只会执行最后一个respose。

@app.before_request       # 1

@app.before_request       # 2

@app.after_request          # 3

@app.after_request          # 4

执行顺序 1 2 4 3

即before 按正序

after按反序



版权声明:本文为DeskyAki原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。