gpt4 book ai didi

python - Flask-Limiter 不适用于基于 Flask-Restful API 的应用程序

转载 作者:行者123 更新时间:2023-12-04 11:36:26 27 4
gpt4 key购买 nike

我正在尝试使用 flask_restful 构建一个 RESTful API 应用程序, 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 token ,其用户名作为 JWT 身份存储在其中。当 /test使用此 token 访问端点,我想检查此特定用户(即此特定身份)访问此端点的次数,因此使用 get_jwt_identitykey_funcLimiter .

问题是我访问 /test时没有任何限制运行上述代码时的端点;我可以随心所欲地访问它,尽可能快地访问它。我在这里错过了什么吗?

最佳答案

我遇到了类似的问题,并找到了一个似乎有效的解决方案。 Flask-Restful做事有点不同。它创建可插入的 View 。在 Flask-Limiter 中有一节关于这个特殊案例的文档 - https://flask-limiter.readthedocs.io/en/stable/#using-flask-pluggable-views

class Test(Resource):

decorators = [limiter.limit("5/minute")]

def get(self):
...
而不是通过 @limiter.limit 提供装饰器,我们需要以这种方式提供它。
我也有关于从哪里获得 limiter 的引用的问题。从。在某些基目录中,您可以实现它并在您的类中导入。
from flask import Flask
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

_app = Flask(__name__)
limiter = Limiter(
_app,
key_func=get_remote_address
)

关于python - Flask-Limiter 不适用于基于 Flask-Restful API 的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60369112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com