Тестовое задание avito. Глобальные переменные storage и banned можно заменить на mongodb или 2 таблицы в любой реляционной бд, если потребуется сохронять состояние между перезапусками или если серверов несколько.
docker-compose build
docker-compose up
или
pip install -r requirements.txt
python3.7 ./main.py
pytest
В файле app.toml
times - Ограничение на количество запросов
second - Длительность окна в секундах
bantime - Длительность бана за привышеие количества запросов в секундах
mask - маска подсети
Для условий из задания настройки выгледят так:
[ip]
mask = "255.255.255.0"
[slow]
times = 100
seconds = 60
bantime = 180
/ - быстрый эндпоинт для тестов, ограничения 100 запросов в секунду и 5 секунд бана
/slow - настраиваемый эндпоинт, настройки выше
/rs - сбрасывает статистику и баны для всех эндпоинтов для подсети к которой пренадлежит ip из заголовка
Код 401 и json с ошибкой header error если ip в хедере не верный или хедера нет
Код 429 и json с ошибкой Too many requests если попал в бан
Код 200 и статика, если всё ок