flask 自定义中间件

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/DeskyAki/article/details/97023979
            </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>

根据装饰器


 
 
  1. from functools import wraps
  2. def auth(func):
  3. @wraps(func)
  4. def inner(*args, **kwargs):
  5. if not session.get( 'user'):
  6. return redirect(url_for( 'login'))
  7. ret = func(*args, **kwargs)
  8. return ret
  9. return inner
  10. @app.route('/login', methods=["GET", "POST"])
  11. @auth
  12. def login():

自定义全局装饰器

写在app.py中


 
 
  1. class Middleware(object):
  2. def __init__(self, old):
  3. self.old = old
  4. def __call__(self, *args, **kwargs):
  5. print( '请求前的操作')
  6. ret = self.old(*args, **kwargs)
  7. print( '请求之后操作')
  8. return ret
  9. if __name__ == '__main__':
  10. app.wsgi_app = Middleware(app.wsgi_app)
  11. app.run()

自带的全局装饰器before_request

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


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

自带的全局装饰器after_request

必须有返回值


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

 

几个中间件的执行顺序


 
 
  1. @app.before_request
  2. def x1():
  3. print( 'before')
  4. @app.after_request
  5. def x2(response): # 必须有response
  6. print( 'after')
  7. return response
  8. @app.route('/index/')
  9. def index():
  10. print( 'index')
  11. return "index"
  12. 执行打印结果
  13. before
  14. index
  15. 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按反序

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值