Я пытаюсь создать приложение 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
при выполнении вышеуказанного кода; Я могу получить к нему доступ столько раз, сколько захочу и так быстро, как захочу. Я что-то здесь упускаю?