自定义局部中间件
根据装饰器
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 版权协议,转载请附上原文出处链接和本声明。