Примените декоратор Flask MethodView только для некоторых методов - PullRequest
1 голос
/ 11 ноября 2019

Мне было интересно, есть ли способ использовать декоратор только для некоторых методов из моего класса, например, в следующем коде я хочу, чтобы token_required декорировал все методы, кроме POST, как я мог бы этого добиться? ?

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 Ответ

1 голос
/ 11 ноября 2019

Вот несколько способов.

1) Добавить условие на request method в 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.

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

Просто добавьте к определенной конечной точке, когда требуется токен:

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

Надеюсь, это поможет.

...