使用可插入视图在蓝图上激活FlaskLimiter

时间:2019-01-03 14:47:48

标签: python flask

我正在尝试使用可插入视图在应用程序工厂功能中注册蓝图,同时像这样传递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函数中或附近定义速率限制。

0 个答案:

没有答案