django_rate_limit_redis - это приложение контроля и ограничения входящих/исходящих запросов,
Project description
Django-Rate-Limit
Installation
$ pip install django_rate_limit_redis
Описание
Django-Rate-Limit - это приложение контроля и ограничения входящих/исходящих запросов, разработанное для работы в контейнерезированном состоянии, исполюзующее Redis и PostgreSQL как связующее звено.
rate_limit(
system=None, # Имя вашего приложения либо Api константа
redis_url=None, # адрес redis
limit=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 # удобная вам БД redis
RATELIMITER_REDIS_URL = f'redis://redis:6379/{redis_db}'
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
'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.py
from django_rate_limit_redis.decorators import rate_limit
from django.urls import path
from . import views
urlpatterns = [
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.py
from django_rate_limit_redis.decorators import rate_limit
from django.utils.decorators import method_decorator
from rest_framework import generics
from .models import SomeMoreModel
from .serializers import SomeMoreSerializer
@method_decorator(rate_limit(system='api'), name='list')
class SomeMoreYourViews(generics.ListAPIView):
queryset = SomeMoreModel.objects.all().order_by('-id')
serializer_class = SomeMoreSerializer
Исходящие запросы
Для исходящих запросов необходимо собрать базовый адрес и передать его как именованный аргумент method_name
import json
import requests
from django_rate_limit_redis.decorators import rate_limit
@rate_limit(system="your_name_app", request_method="GET")
def request_get(url, headers=None, data=None, params=None, auth=None):
response = requests.get(url, headers=headers, data=json.dumps(data), params=params, auth=auth)
return response
@rate_limit(system="your_name_app", request_method="POST")
def request_post(url, headers=None, data=None, params=None, auth=None):
response = requests.post(url, headers=headers, data=json.dumps(data), params=params, auth=auth)
return response
your_url = "https://your_url.com/api/"
some_arg = 321
method_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}/
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_rate_limit_redis-0.0.25.tar.gz.
File metadata
- Download URL: django_rate_limit_redis-0.0.25.tar.gz
- Upload date:
- Size: 171.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.22.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d284105f29328655aa7391de2175ac7db5d91e16cde15fb582d57c5bd4ed087
|
|
| MD5 |
4b933634f6b5af278fdf67e336736537
|
|
| BLAKE2b-256 |
7cd8d9fb902c7b7e225e365932fba3e09444bbbc633af3b5a77be8d4b68d4f7f
|
File details
Details for the file django_rate_limit_redis-0.0.25-py2.py3-none-any.whl.
File metadata
- Download URL: django_rate_limit_redis-0.0.25-py2.py3-none-any.whl
- Upload date:
- Size: 46.4 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.22.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d5114522f38e16e7195473c3be93d796080b78e4fd22b4179b295f42835bfc7
|
|
| MD5 |
319caf85176df3ace9427ba712a6c15f
|
|
| BLAKE2b-256 |
db52c6bd1bab375386d2b37da8844bf96eb597cf2e632e60f7acd62c280f474d
|