本文介绍了基于Python Rate Limit类的视图Flask的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在关注以下示例:

http://flask-limiter.readthedocs.org/en/stable /#ratelimit-string

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

class MyView(flask.views.MethodView):
    decorators = [limiter.limit("10/second")]
    def get(self):
        return "get"

    def put(self):
        return "put"

我的问题是,在示例中,应用程序,限制器和类在同一文件中定义,对于我来说,应用程序和限制器在同一文件中定义,但我的类位于单独的文件中.

My problem is that in example, the application, limiter and classes are defined in the same file in my case the application and limiter are defined in the same file but my classes live in a separate file.

如果我导入限制器或应用程序,则由于循环依赖性,我的Flask应用程序无法启动.如何解决此问题,推荐的方法是什么?我想将限制器应用于特定端点.我尝试使用from flask import current_app来初始化限制器,但此功能未将其用作有效参数.有什么建议吗?

If I import either limiter or app my Flask app doesn't start because circular dependencies. How can fix this, what is the recommended way? I want to apply limiter to specific endpoints.I tried from flask import current_appin order to initialize limiter but this function was not take it as a valid parameter. Any recommendations?

文件信息:

  • app.py
  • api_main.py

在app.py下,我已经定义了资源:

Under app.py I have defined my resources:

api_app = Flask(__name__)  # Flask Application
api_app.config.from_pyfile("../../../conf/settings.py")  # Flask configuration

imbue_api = restful.Api(api_app)  # Define API
limiter = Limiter(api_app, key_func=get_remote_address, global_limits=["10 per second"])

imbue_api.add_resource(ApiBase, settings.BASE_API_URL)

在api_main.py中,我定义了所有类:

In api_main.py I have defined all my classes:

class ApiBase(Resource):
    @authenticator.requires_auth
    def get(self):
        """

        :return:
        """
        try:
            # =========================================================
            # GET API
            # =========================================================
            log.info(request.remote_addr + ' ' + request.__repr__())
            if request.headers['Content-Type'] == 'application/json':
                # =========================================================
                # Send API version information
                # =========================================================
                log.info('api() | GET | Version' + settings.api_version)
                response = json.dumps('version: ' + settings.api_version)
                resp = Response(response, status=200, mimetype='application/json')
                return resp

        except KeyError:
            response = json.dumps('Invalid type headers. Use application/json')
            resp = Response(response, status=415, mimetype='application/json')
            return resp

        except Exception, exception:
            log.exception(exception.__repr__())
            response = json.dumps('Internal Server Error')
            resp = Response(response, status=500, mimetype='application/json')
            return resp

推荐答案

使用Resource.method_decorators

https://github.com/flask-restful/flask-restful/blob/master/flask_restful/初始化 .py#L574

https://github.com/flask-restful/flask-restful/blob/master/flask_restful/init.py#L574

它适用于每个请求.您可以在视图类中覆盖它:

It is applied for each request. You can override it in your view class:

@property
def method_decorators(self):
    # get some limiter bound to the `g` context
    # maybe you prefer to get it from `current_app`
    return g.limiter

如果愿意,可以在将资源添加到静态API之前将限制器附加到现有的method_decorators.

If you prefer, you can append the limiter to the existing method_decorators before adding the resource to your restful API.

ApiBase.method_decorators.append(limiter)
imbue_api.add_resource(ApiBase, settings.BASE_API_URL)

这篇关于基于Python Rate Limit类的视图Flask的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-20 03:23