仅将Flask MethodView装饰器应用于某些方法 [英] Apply Flask MethodView decorator just for some methods

查看:53
本文介绍了仅将Flask MethodView装饰器应用于某些方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道是否有某种方法可以仅对类中的某些方法使用装饰器,例如,在下面的代码中,我希望 token_required 来装饰除POST之外的所有方法,如何我可以实现吗?

I was wondering if there is any way that I can use a decorator just for some methods from my class, for example in the following code I want token_required to decorate all methods excepting the POST, how could I possibly achieve that?

class UserAPI(MethodView):
    def token_required(view_method):
        @wraps(view_method)
        def decorated(*args, **kwargs):
            token = None

            if 'token' in request.headers:
                token = request.headers['token']

            if not token:
                return "no token"

            return view_method(*args, **kwargs)

        return decorated

    decorators = [token_required]

    def get(self, user_id):
        if user_id is None:
            # return a list of users
            return "no user id"
        else:
            # expose a single user
            return "user id"

    def post(self):
        # create a new user
        return "create new user"

    def delete(self, user_id):
        # delete a single user
        return "delete user id"

    def put(self, user_id):
        # update a single user
        return "update user id"

推荐答案

以下是几种方法.

1)请求方法上的条件添加到 decorator 中:

1) Add condition on request method into decorator:

@wraps(view_method)
def decorated(*args, **kwargs):
     if request.method == 'POST':
         # skip token processing - just result of view method 
         return view_method(*args, **kwargs)
     token = None # etc... (your code)

2)С.为任意点创建一个通用的 decorator ,并在没有 decorators 属性的情况下使用它.

2) Сreate a universal decorator for any point and use him without decorators property.

from functools import wraps

def token_required():
    def _token_required(f):
        @wraps(f)
        def __token_required(*args, **kwargs):
            token = None
            if 'token' in request.headers:
                token = request.headers['token']

            if not token:
                return "no token"

            return f(*args, **kwargs)
        return __token_required
    return _token_required

仅在需要令牌时添加到特定端点:

Just add to specific endpoint when token is required:

@token_required()
def get(self, user_id):
    ...

希望这会有所帮助.

这篇关于仅将Flask MethodView装饰器应用于某些方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆