Python 速率限制 class 基于视图 Flask
Python Rate Limit class based view 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"
我的问题是,在示例中,应用程序、限制器和 类 定义在同一个文件中,在我的例子中,应用程序和限制器定义在同一个文件中,但我的 类 位于一个单独的文件。
如果我导入限制器或应用程序,我的 Flask 应用程序不会启动,因为循环 dependencies。如何解决这个问题,推荐的方法是什么?我想将限制器应用于特定端点。
我尝试 from flask import current_app
以初始化限制器,但此函数未将其作为有效参数。有什么建议吗?
文件信息:
- app.py
- api_main.py
在app.py下我定义了我的资源:
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中我定义了我所有的类:
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/init.py#L574
它适用于每个请求。您可以在您的视图中覆盖它 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
如果您愿意,可以在将资源添加到 restful API.
之前将限制器附加到现有的 method_decorators
ApiBase.method_decorators.append(limiter)
imbue_api.add_resource(ApiBase, settings.BASE_API_URL)
我正在学习这个例子:
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"
我的问题是,在示例中,应用程序、限制器和 类 定义在同一个文件中,在我的例子中,应用程序和限制器定义在同一个文件中,但我的 类 位于一个单独的文件。
如果我导入限制器或应用程序,我的 Flask 应用程序不会启动,因为循环 dependencies。如何解决这个问题,推荐的方法是什么?我想将限制器应用于特定端点。
我尝试 from flask import current_app
以初始化限制器,但此函数未将其作为有效参数。有什么建议吗?
文件信息:
- app.py
- api_main.py
在app.py下我定义了我的资源:
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中我定义了我所有的类:
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/init.py#L574
它适用于每个请求。您可以在您的视图中覆盖它 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
如果您愿意,可以在将资源添加到 restful API.
之前将限制器附加到现有的method_decorators
ApiBase.method_decorators.append(limiter)
imbue_api.add_resource(ApiBase, settings.BASE_API_URL)