flask 中间件

自定义局部中间件

根据装饰器

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按反序

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值