Flask-Limiter не работает при развертывании в Heroku

Я создал фляжное приложение, которое я бы также ограничил добавлением Flask-Limiter. Он намерен позволить пользователю использовать маршрут один раз в минуту. Если пользователь пытается снова, он перенаправляется на пользовательскую страницу 429. На локальном хосте он работает абсолютно идеально, однако при фиксации его в моем приложении Heroku ограничитель не препятствует многократному использованию маршрута. Он также не перенаправляет на страницу 429.

app = Flask(__name__)
limiter = Limiter(
    app,
    key_func=get_remote_address,
    default_limits=["200 per day", "50 per hour"]
)

@main_bp.route('/main', methods=['POST'])
@limiter.limit("1/minute")
def text_sum():
   the code blah blah blah

@main_bp.errorhandler(429)
def ratelimit_handler(e):
    return render_template('main429.html', result = "Please try again in 1 minute")

person I_Have_Many_Questions    schedule 06.08.2020    source источник
comment
Это может быть связано с тем, что heroku по умолчанию использует 2 рабочих-стрелков. Входящие запросы попадают в случайный рабочий процесс, каждый из которых имеет свою собственную память. Быстрым обходным путем было бы указать 1 работника (как в ответе, который я связал). Если вам нужно масштабироваться до нескольких рабочих процессов, используйте серверную часть хранилища для Flask-Limiter, например Redis как задокументировано. На Heroku вам понадобится дополнение Redis, которое может подтолкнуть тебя к платному тиру.   -  person v25    schedule 06.08.2020
comment
Спасибо, это сработало блестяще!   -  person I_Have_Many_Questions    schedule 09.08.2020


Ответы (1)


Как указано в v25, я просто изменил procfile на это:

web: gunicorn --workers 1 wsgi:app
person I_Have_Many_Questions    schedule 08.08.2020
comment
Просто следите за производительностью под нагрузкой. Должно подойти для небольшого объема трафика, особенно если у вас нет функций, которые «блокируют». Чтобы быть уверенным, вы можете протестировать с помощью инструмента нагрузочного тестирования, такого как hey. Для обработки больших объемов трафика вы можете рассмотреть Redis в качестве бэкенда для Limiter, что позволит вам начать с нескольких воркеров синхронизации или перейти к асинхронным воркерам, таким как gevent или eventlet. Вы можете узнать больше о параллелизме в обсуждениях подобных этому. - person v25; 09.08.2020