版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
</div>
<!--一个博主专栏付费入口-->
<!--一个博主专栏付费入口结束-->
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
<div class="htmledit_views" id="content_views">
<h2 id="%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%80%E9%83%A8%E4%B8%AD%E9%97%B4%E4%BB%B6"><a name="t0"></a>自定义局部中间件</h2>
根据装饰器
-
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按反序