Flask全局拦截器&局部拦截器

拦截器

在开发网站时,不同路由下有可能需要做一些重复的判断。例如购物网站中管理员想要获取所有订单的信息,需要首先判断管理员是否登录,如果没有登录肯定是没有权限的。同理,管理员的其他操作同样需要这样的判断。

这种情况下,下面的判断登录代码就会在不同的路由中重复出现

    if request.method == "GET":
        sId = session.get("_id", None)
        if not sId:
            return result(203, {"info": "未登录"})
    if request.method == "POST":
        sId = session.get("_id", None)
        if not sId:
            return result(203, {"info": "未登录"})

为了避免重复,我们可以使用拦截器。通俗来讲,就是在路由函数执行前先执行另外一个函数,也就是该路由函数被拦截了,先进行其他的预先判断。

查阅资料,Flask中拦截器分为两种,全局拦截器局部拦截器

一、全局拦截器

一般是在所有路由前添加一个@app.before_request
判断语句和以前一样,如果没有登录提示未登录,如果登录了就pass

@app.before_request
def before():
    _id = session.get("_id", None)
    if not _id:
        return result(203, {"info": "未登录"})
    else:
        pass

但这样也有一个问题,有些路由函数,例如登录和注册不能被拦截。试想一个用户连账号都没有,或者还没有登录就检索他的id,结果必然是未登录甚至报错。并且因为拦截器作用在全局,那么所有的网页,静态资源,js一概会被拦截,导致有些必要网页根本加载不出来。

这时候就要设置白名单,来过滤掉一些内容

@app.before_request
def before():
    url = request.path  # 当前请求的URL
    passUrl = ["/login", "/regist"]
    if url in passUrl:
        pass
    else:
        _id = session.get("_id", None)
        if not _id:
            return result(203, {"info": "未登录"})
        else:
            pass

通过passUrl = ["/login", “/regist”]设置了白名单,如果当前url在白名单内则不会拦截。

还可以通过筛选url的后缀,把一些资源文件加入白名单。

    suffix = url.endswith('.png') or url.endswith('.jpg') or url.endswith('.css') or url.endswith('.js')
    if url in passUrl or suffix:
        pass

总结来讲,全局拦截器的确避免了重复,但也有一些缺点:

  1. 需要制定白名单
  2. 对每个接口都进行拦截判断,降低了服务器的性能

二、模块拦截器

也叫视图拦截器,只针对某一个模块进行拦截,应用于Blueprint模块中。
把需要事前拦截的接口和拦截器一起放在一个视图模板里。

代码与全局拦截器一样,但位置放在了某一模块的py文件里。这样一来,只有设置了拦截器的接口是访问不了的,其他的页面包括图片,css,js等都能成功加载并渲染。

三、简单实例测试

before函数里我们简单的打印一下

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

使用Postman随意访问一个接口
在这里插入图片描述
肯定会报错,因为没写完整。但PyCharm里成功打印出了ok字样,说明拦截成功
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湫兮如风i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值