Я пытаюсь зарегистрировать план в функции фабрики приложений, используя сменное представление, передавая экземпляр 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)
Согласно документам ограничителя 1006 *, я должен иметь возможность украсить класс следующим образом:
class Pluggable(MethodView):
decorators = [self.limiter.limit("1 per minute")]
def __init__ (self, limiter):
self.limiter = limiter
Однако я обнаружил, что это не работает, когда limiter
передается через функцию init:
decorators = [self.limiter.limit("1 per minute")]
NameError: name 'self' is not defined
Поэтому я попытался изменить это на:
def __init__ (self, limiter):
self.decorators = [limiter.limit("1/minute")]
Это не вызывает исключения, но и не применяет ограничение к конечной точке (если я что-то не пропустил).
Чтобы подойти к этому по-другому, я мог бы пойти на Документы Flask , в которых предлагается использовать следующий формат, который был бы внутри функции фабрики моего приложения:
# 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
.