Декоратор не возвращает объект в метод get - PullRequest
1 голос
/ 28 октября 2019

Я написал небольшой API-интерфейс falsk-restpluss с двумя конечными точками: / login и /users.

Он имеет аутентификацию jwt, и эта часть работает нормально.

Декоратор, которыйпроверка токена также приводит к получению текущего пользовательского объекта из базы данных и отправке его обратно в функцию get.

мне кажется, что декоратор не возвращает объект функции get, и я могу 't выяснить, почему.

Любая помощь очень ценится!

Я получаю эту ошибку:

if not current_user.admin:
AttributeError: 'Users' object has no attribute 'admin'

Я использую flask-restplus и python 3.7

Это мой код:

import ....
(Import left out) 

app = Flask(__name__)
app.config.SWAGGER_UI_DOC_EXPANSION = 'full'

authorizations = {
    'apikey' : {
        'type' : 'apiKey',
        'in' : 'header',
        'name' : 'X-API-KEY'
    }
}

db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    ....
    (Rest of the definitions is left out.)

def token_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        token = None
        if 'X-API-KEY' in request.headers:
            token = request.headers['X-API-KEY']

        if not token:
            return {'message' : 'Token is missing!'}, 401
        try:
            data = jwt.decode(token, app.config['SECRET_KEY'])
            current_user = User.query.filter_by(public_id=data['public_id']).first()

        except:
            return {'message' : 'Token is invalid!'}, 401

        return f(current_user, *args, **kwargs)
    return decorated

@api.route('/user')
class Users(Resource):
    @token_required
    @api.doc(security='apikey')

    def get(self,current_user):
        if not current_user.admin:
            return {'message' : 'Cannot perform that function!'}

        return {'users' : 'List of users to come.'}

@api.route('/login')
class Login(Resource):
    def get(self):
        auth = request.authorization

        if not auth or not auth.username or not auth.password:
            return make_response('No user credits are entered', 401, {'WWW-Authenticate' : 'Basic realm="Login required!"'})

        user = User.query.filter_by(name=auth.username).first()

        if not user:
            return make_response('user is empty', 401, {'WWW-Authenticate' : 'Basic realm="Login required!"'})

        token = jwt.encode({'public_id' : user.public_id, 'exp' : datetime.now() + timedelta(minutes=30)}, app.config['SECRET_KEY'])

        if check_password_hash(user.password, auth.password):
            token = jwt.encode({'public_id' : user.public_id, 'exp' : datetime.now() + timedelta(minutes=30)}, app.config['SECRET_KEY'])
            return {'token' : token.decode('UTF-8')}

        return make_response('User not hashed', 401, {'WWW-Authenticate' : 'Basic realm="Login required!"'})

1 Ответ

0 голосов
/ 28 октября 2019

Вам нужно принять и передать аргумент self.

@wraps(f)
def decorated(self, *args, **kwargs):
    ...
    return f(self, current_user, *args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...