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 对象

    错误:

    正确:

  • 相关阅读:
    Insert into a Binary Search Tree
    Search in a Binary Search Tree
    Binary Search Tree Iterator
    Validate Binary Search Tree
    Serialize and Deserialize Binary Tree
    图的搜索
    codeforce vk cup2017
    hdu1160dp
    完全背包hdu1114
    最长递增子序列hdu1087
  • 原文地址:https://www.cnblogs.com/chnmig/p/13368569.html
Copyright © 2011-2022 走看看