Как использовать декоратор в Python для выполнения аутентификации?

#python #python-3.x #flask

#python #python-3.x #flask

Вопрос:

Я реализую Flask-RESTful API, где я получаю токен от postman и сравниваю его с токеном, который я настроил в своем коде, как показано ниже:

 file: functions.py

def authenticate():
    headers = flask.request.headers
    bearer = headers.get('Authorization')
    token = bearer.split()[1]
    try:
        if str(hashlib.md5(b'Token_String').hexdigest()) == token:
            logger.info('Token authentication successful.')
            return True
        else:
            logger.error('Token autherization failed. Please check the token supplied.')
            return False
    except Exception as e:
        if token is None:
            logger.info('Token cannot be null. Supply a token with API call.')
            return {'message': 'Token cannot be null. Exception: {error}'.format(error=e)}, 400
        else:
            logger.info('Token cannot be null. Supply a token with API call.')
            return {'message': 'Error reading token. Cannot be Null/Empty. Exception: {error}'.format(error=e)}, 400
  

Это метод get моего API:

 class APIClass(Resource):

    @classmethod
    def get(self):
        logger.info('Initiating get()')
        if fc.authenticate():
            run_some_sql_statements
        else:
            return {'message': 'Token authentication failed'}, 401
        pass
  

Вместо использования IF-условия, есть ли способ, которым я могу использовать метод: authenticate из functions.py файла в качестве декоратора поверх моего get() .

Я попытался сделать это и столкнулся с приведенной ниже ошибкой:

 from validations import functions as fc     

@classmethod
@fc.authenticate
def get(self):
  

Но я вижу ошибку компиляции: Function 'authenticate' lacks a positional argument

Кто-нибудь может сообщить мне, в чем ошибка, которую я допустил здесь, и как я могу ее исправить?

Ответ №1:

Документы flask-restful содержат раздел о декораторах методов ресурсов:https://flask-restful.readthedocs.io/en/latest/extending.html#resource-method-decorators

 class APIClass(Resource):
    method_decorators = [authenticate]
  

Комментарии:

1. это в документах: method_decorators = {'get': [cache]}