Package: django_rate_limit_redis
Django-Rate-LimitInstallation$pipinstalldjango_rate_limit_redisОписаниеDjango-Rate-Limit - это приложение контроля и ограничения входящих/исходящих запросов,
разработанное для работы в контейнерезированном состоянии, исполюзующее Redis и PostgreSQL как связующее звено.rate_limit(system=None,# Имя вашего приложения либо Api константаredis_url=None,# адрес redislimit=1,# разрешенное количество запросовwindow=1,# временное окно в секундах в котором выполняется разрешенное количество запросовblocking_timeout=None,# время ожидания блокировки исходящих запросовrequest_method=None# базовый адрес запроса (шаблон урла))ЛогикаПри создании входящего/исходящего запроса, берется шаблон урла,
по данному шаблону производится поиск значений настроек в redis, если значение в redis отсутствует,
то поиск производится в БД, в случае если в БД данные остутствуют,
в БД устанавливается значение по умолчанию переданные в декораторlimit=1, window=1, после чего производится
сохранение в redis.Входящие запросы при превышении частоты запросов возвращаютHTTP_429_TOO_MANY_REQUESTSИсходящие запросы ожидают окна (выполнение рандомно и не имеет сортировки) для отправки запроса на переданный урл,
время ожидания регулируется именованным аргументомblocking_timeout, в случаеNoneзначения,
ожидание окна будет без временного ограничения.django-adminВ случае использования администрирования, будет доступен раздел содержащий
в себе настройки ограничений входящих и исходящих запросовДобавление новых ограничений производится как вручную, так и автоматически при создании входящих/исходящих запросов.
При наличии авторизации в views так же будет учитываться пользователь входящих запросов,
для детальной настройки ограничений. Пользователь для исходящих запросов пока не предусмотрен.SettingsНеобходимо добавить путь к Redis и добавитьrate_limitв установленные приложения.redis_db=2# удобная вам БД redisRATELIMITER_REDIS_URL=f'redis://redis:6379/{redis_db}'# Database# https://docs.djangoproject.com/en/3.2/ref/settings/#databasesDATABASES={'default':{'ENGINE':'django.db.backends.postgresql','NAME':'mydatabase','USER':'mydatabaseuser','PASSWORD':'mypassword','HOST':'127.0.0.1','PORT':'5432',}}INSTALLED_APPS=[...,'django_rate_limit_redis','your_app',]AUTH_USER_MODEL='SomeUsersModel'ПримерыВходящие запросыurls.pyfromdjango_rate_limit_redis.decoratorsimportrate_limitfromdjango.urlsimportpathfrom.importviewsurlpatterns=[path('/your-views/',rate_limit(system='api')(views.YourViews.as_view()),name='your-views'),path('/more-your-views/',rate_limit(system='api')(views.MoreYourViews.as_view()),name='more-your-views'),]views.pyfromdjango_rate_limit_redis.decoratorsimportrate_limitfromdjango.utils.decoratorsimportmethod_decoratorfromrest_frameworkimportgenericsfrom.modelsimportSomeMoreModelfrom.serializersimportSomeMoreSerializer@method_decorator(rate_limit(system='api'),name='list')classSomeMoreYourViews(generics.ListAPIView):queryset=SomeMoreModel.objects.all().order_by('-id')serializer_class=SomeMoreSerializerИсходящие запросыДля исходящих запросов необходимо собрать базовый адрес и передать его как именованный аргументmethod_nameimportjsonimportrequestsfromdjango_rate_limit_redis.decoratorsimportrate_limit@rate_limit(system="your_name_app",request_method="GET")defrequest_get(url,headers=None,data=None,params=None,auth=None):response=requests.get(url,headers=headers,data=json.dumps(data),params=params,auth=auth)returnresponse@rate_limit(system="your_name_app",request_method="POST")defrequest_post(url,headers=None,data=None,params=None,auth=None):response=requests.post(url,headers=headers,data=json.dumps(data),params=params,auth=auth)returnresponseyour_url="https://your_url.com/api/"some_arg=321method_name=f"{your_url}"+"{some_arg}/"#  "https://your_url.com/api/{some_arg}/"response=request_get(f"{your_url}{some_arg}/",method_name=method_name)#  "https://your_url.com/api/321/"Для GET запроса, информация будет сохранена в БД и Redis по ключуGET https://your_url.com/api/{some_arg}/Для POST запроса, информация будет сохранена в БД и Redis по ключуPOST https://your_url.com/api/{some_arg}/Так же есть возможность убрать разделение на методы,
убрав именованный аргументrequest_methodу декоратора@rate_limit,
в таком случае будет проверяться урл целиком без привязки к методуhttps://your_url.com/api/{some_arg}/