Активируйте FlaskLimiter на чертеже с подключаемым представлением - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь зарегистрировать план в функции фабрики приложений, используя сменное представление, передавая экземпляр 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...