我正在尝试使用可插入视图在应用程序工厂功能中注册蓝图,同时像这样传递Flask Limiter
实例:
limiter = Limiter(app, key_func=get_remote_address)
the_api = Blueprint('the_api', __name__)
the_api.add_url_rule('/pluggable',
view_func=Pluggable.as_view('pluggable', limiter))
app.register_blueprint(the_api)
根据limiter docs,我应该能够如下装饰类:
class Pluggable(MethodView):
decorators = [self.limiter.limit("1 per minute")]
def __init__ (self, limiter):
self.limiter = limiter
但是,我发现通过初始化函数传递limiter
时,此方法不起作用:
decorators = [self.limiter.limit("1 per minute")]
NameError: name 'self' is not defined
所以我尝试将其更改为:
def __init__ (self, limiter):
self.decorators = [limiter.limit("1/minute")]
这不会引发异常,但是它也不会将限制应用于端点(除非我错过了一些事情)。
要以另一种方式处理此问题,我可以遵循Flask Docs,它建议使用以下格式,该格式将在我的应用程序工厂函数中显示:
# DOC example
view = user_required(UserAPI.as_view('users'))
app.add_url_rule('/users/', view_func=view)
但是我发现这行不通,因为我还需要调用方法Limiter.limit
。
view = Pluggable.as_view('pluggable')
limited_view = limiter(view).limit('1 per minute')
the_api.add_url_rule('/pluggable', view_func=limited_view)
会产生错误:
limited = limiter(view).limit('1 per minute')
TypeError: 'Limiter' object is not callable
实现此目标的正确方法是什么?我是否应该在MethodView.__init__
函数中为每个可插入视图创建限制器。这听起来效率低下,再加上我想在add_url_rule
函数中或附近定义速率限制。