首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask-Limiter不适用于基于Flask-Restful API的应用程序

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

Stack Overflow用户
提问于 2020-02-24 11:18:38
回答 1查看 991关注 0票数 5

我正在尝试使用flask_restfulflask_jwt_extendedflask_limiter构建一个RESTful应用程序接口应用程序,用于用户授权和将用户配额限制在6/分钟。我的玩具/测试代码如下(尚未实现实际的授权方案):

代码语言:javascript
复制
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端点时,我希望检查此特定用户(即此特定身份)访问此端点的次数,从而将get_jwt_identity用作Limiterkey_func

问题是,当我运行上面的代码时,我访问/test端点时没有任何限制;我可以想访问它多少次就访问多少次,想访问多少次就访问多少次。我是不是漏掉了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-02-18 00:32:48

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

代码语言:javascript
复制
class Test(Resource):

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

  def get(self):
     ...

我们需要以这种方式提供装饰器,而不是通过@limiter.limit提供它。

我也有一个问题,关于从哪里获得limiter的引用。在某些基目录中,您可以实现此功能并在类中导入。

代码语言:javascript
复制
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
)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60369112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档