flask为多个接口添加同一个拦截器的方法

Posted ChnMig

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask为多个接口添加同一个拦截器的方法相关的知识,希望对你有一定的参考价值。

前言

最近又抽掉出来写一个 Python 项目, 框架使用 Flask , 又有些新心得, 比如本篇所说, 想要将某个蓝图加上统一的权限控制, 比如 admin 蓝图全部有一个统一的拦截器判断是否有权限操作, 这里记录两个方法, 有利有弊

正文

使用 before_request 钩子

http://docs.jinkan.org/docs/flask/reqcontext.html?highlight=before_request#callbacks-and-errors

flask提供了几个钩子, 在不同情况下触发, 比如 before_request 钩子, 在每次请求进入正式的 view 前执行, 如果在这个过程中 return 则直接返回, before_request 钩子适用于 flask 的 app 对象, 也就是说可以为 flask 的一个最大的 app 创建全局的钩子, 但是我们的目的是为 admin 蓝图去做拦截校验, 因为蓝图的 bp 也是 app 所以我们也可以为单独的蓝图绑定钩子

效果如下

继承 MethodView

Flask 的即插视图类似于 Django ,使用类的方式来编写 view, 让我们可以使用 restful 的方式来编写接口

http://docs.jinkan.org/docs/flask/views.html

那么我们之前使用函数式编写接口时可以使用 装饰器 来达到执行某个逻辑前的校验, 在 即插视图 中也提供了这样的功能

http://docs.jinkan.org/docs/flask/views.html#id5

注册 decorators ,他的值是一个可迭代的类型, 请求会依次执行里面注册的函数, 执行完才执行逻辑代码, 类似于

但是我们的需求是某个蓝图下的所有接口都有一个统一的拦截器, 难道需要我们每一个视图都注册拦截器吗? 我们发现, 其实每个视图都继承了一个 MethodView 类, 我们是否可以使用继承的方式来解决呢? 肯定可以啊

于是代码修改为

以后需要使用该拦截器的视图都继承该自写的视图即可

需要注意的是: 如果装饰视图有多个, 比如

decorators = [cweVerify, admin_login_required]

那么其执行顺序是 admin_login_required > cweVerify 是反着来的, 这一点需要注意

另外, 该方法也可以使用 g 对象, 但是注意, 在即插视图中, 只有进入到请求的生命周期中才可以使用 g 对象

错误:

正确:

以上是关于flask为多个接口添加同一个拦截器的方法的主要内容,如果未能解决你的问题,请参考以下文章

AOP框架Dora.Interception 3.0 [3]: 拦截器设计

SpringBoot拦截器使用@Autowired注入接口为null解决方法

如何正确地将多个片段添加到片段过渡?

mybatis原理

SpringBoot拦截器----addInterceptors

postman添加断言