2016-04-26 13 views
2

Ich folge diesem Beispiel:Python Rate Limit Klasse basiert Ansicht 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" 

Mein Problem ist, dass in beispielsweise die Anwendung, Limiter und Klassen in der gleichen Datei definiert sind, in meinem Falls die Anwendung und der Begrenzer in derselben Datei definiert sind, leben meine Klassen in einer separaten Datei.

Wenn ich entweder Limiter oder App importiere, fängt meine Flask App nicht an, weil zirkulär dependencies. Wie kann das behoben werden, was ist der empfohlene Weg? Ich möchte den Begrenzer auf bestimmte Endpunkte anwenden. Ich versuchte from flask import current_app, um Begrenzer zu initialisieren, aber diese Funktion wurde nicht als gültiger Parameter genommen. Irgendwelche Empfehlungen?

Datei-Information:

  • app.py
  • api_main.py

Unter app.py ich meine Ressourcen definiert haben:

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) 

In api_main. py Ich habe alle meine Klassen definiert:

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 

Antwort

1

Verwenden der Resource.method_decorators

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

es für jede Anforderung angewandt wird. Sie können es in der Ansichtsklasse außer Kraft setzen:

@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 

Wenn Sie möchten, können Sie den Limiter an die bestehende method_decorators anhängen, bevor die Ressource Ihre RESTful API hinzufügen.

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