美文网首页
python 中使用装饰器来统一检查 flask 用户权限

python 中使用装饰器来统一检查 flask 用户权限

作者: wingfish | 来源:发表于2017-04-02 21:26 被阅读0次

    最近在一个项目中,需要判断 restful 接口函数传入的时候,是否之前已经登录状态是某个特定用户,以及该用户有没有指定的权限。检查下来如果没有的话,立刻返回错误,中断功能。

    遮掩的场景虽然也可以通过标准的调用函数来操作,但都不如用装饰器来得简单。都知道装饰器好用不好写,废话不说,先来看看这个场景怎么实现,还是有一定的通用性的。

    def validate_current_is_admin(f):
        @functools.wraps(f)
        def decorated_function(*args, **kws):
            # 需要在登录状态调用, 检查是否为有admin权限的用户登录,
            # 如果不是,返回错误码;
            if g.user.user_name != 'admin':
                raise CustomFlaskErr(USER_MUST_HAS_ADMIN_PRIVILEGE, status_code=401)
    
            # 验证权限是否为 admin, 不是的话,返回401错误
            if g.user.role_id != Permission.ADMIN:
                raise CustomFlaskErr(USER_MUST_HAS_ADMIN_PRIVILEGE, status_code=401)
    
            return f(*args, **kws)
    
        return decorated_function
    

    这是一个标准的装饰器的写法,如果你要写一个简单的装饰器,整个框架可以参考。

    装饰器调用举例:

    @app.route('/api/create_user', methods=['POST'])
    @auth.login_required
    @validate_current_is_admin
    def create_user():
    
        # 获得参数
        user_name = request.json.get('user_name')
        password = request.json.get('password')
    ......
    

    核心代码的业务逻辑也不复杂,根据 flask 的 g 对象中预存的用户 user 进行检查处理,flask 的这些定义非常灵活,flask.g 怎么使用可以查看 flask 的文档。

    这里的user以及相关的属性属于具体业务逻辑,就不展开解释了,可以望文生义。

    如果检查下来不符合的话,会调用自定义的 flask 错误,这部分内容可以查看之前写的 python flask 写 api 如何返回自定义错误

    因为不对argskws这些参数进行解析和处理,所处理的是 flask 全局对象。最后将参数都原路打包返回即可,没有问题的话交给使用装饰器的代码继续处理。

    这个例子比较简单,主要还是熟悉装饰器的基本用法。

    相关文章

      网友评论

          本文标题:python 中使用装饰器来统一检查 flask 用户权限

          本文链接:https://www.haomeiwen.com/subject/vacgottx.html