Flask -Limiter не работает с Flask -Restful API-приложением - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь создать приложение RESTful API с flask_restful, flask_jwt_extended для авторизации пользователя и flask_limiter, чтобы ограничить квоту пользователя 6 / мин. Мой игрушечный / тестовый код следует (реальные схемы авторизации еще не были реализованы):

from flask import Flask, make_response
from flask_restful import Api, Resource
from flask_limiter import Limiter
from werkzeug.exceptions import HTTPException
from flask_jwt_extended import jwt_required, create_access_token, JWTManager, get_jwt_identity

# custom HTTP exception
class OutOfQuota(HTTPException):
    code = 402
    name = 'Out Of Quota'

app = Flask(__name__)
limiter = Limiter(app, key_func=get_jwt_identity)

api = Api(prefix='')

class Token(Resource):
    def get(self, user):
        return make_response({'token': create_access_token(identity=user)})

class Test(Resource):
    @jwt_required
    @limiter.limit('6/minute')
    def get(self):
        return make_response({'message': f'OK {get_jwt_identity()}'})

api.add_resource(Token, '/token/<string:user>')
api.add_resource(Test, '/test')

api.init_app(app)

# custom error handler (change "Payment Required" to "Out Of Quota" HTTP status
@app.errorhandler(429)
def ratelimit_handler(e):
    return OutOfQuota(f'quota limit exceeded: {e.description}')

jwt = JWTManager(app)

app.config['JWT_SECRET_KEY'] = 'nothing-fancy-for-now'

if __name__ == '__main__':
    app.run(host='localhost', port=8080)

Конечная точка /token генерирует токен JWT для пользователя с его именем пользователя, хранящимся внутри как идентификатор JWT. Когда с помощью этого токена осуществляется доступ к конечной точке /test, я хочу проверить, сколько раз этот конкретный пользователь c (т. Е. Этот идентификатор c) обращался к этой конечной точке, следовательно, использование get_jwt_identity в качестве key_func из Limiter.

Проблема в том, что у меня нет никаких ограничений при доступе к конечной точке /test при выполнении вышеуказанного кода; Я могу получить к нему доступ столько раз, сколько захочу и так быстро, как захочу. Я что-то здесь упускаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...