zoukankan      html  css  js  c++  java
  • 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 对象

    错误:

    正确:

  • 相关阅读:
    使用jaxb用xsd生成java类
    EMF保存CDATA
    windows builder里面的可伸缩面板
    使用eclipse open type对话框
    eclipse中toolbar位置的系统URI
    bzoj 4414 数量积 结论题
    bzoj 4402 Claris的剑 组合数学
    bzoj 4206 最大团 几何+lis
    bzoj 3676 [Apio2014]回文串 回文自动机
    bzoj 3670 [Noi2014]动物园 kmp
  • 原文地址:https://www.cnblogs.com/chnmig/p/13368569.html
Copyright © 2011-2022 走看看