Официальная оригинальная ссылка
Эта серия статей адрес github
Пожалуйста, укажите источник
Дросселирование
Регулирование похоже на разрешения в том смысле, что оно определяет, следует ли авторизовать запрос. Дроссельный клапан указывает на временное состояние и используется для управления скоростью, с которой клиенты могут отправлять запросы к API.
Как и в случае с разрешениями, могут использоваться различные методы регулирования. Ваш API может блокировать неаутентифицированные запросы и в меньшей степени аутентифицированные запросы.
Если вам нужно использовать разные стратегии для ограничения различных частей API, для некоторых услуг, особенно ресурсоемких, вы можете одновременно использовать другую программу одновременно, что есть несколько ограничивающих стратегии.
Вы также можете использовать несколько ограничительных клапанов, если вы хотите одновременно достичь как взрывной, так и постоянной ограничительной скорости. Например, вы можете ограничить количество запросов пользователей до 60 запросов в минуту и до 1000 запросов в день.
Ограничительный клапан не обязательно ограничивает только частоту запросов. Например, службе хранения может также потребоваться ограничить пропускную способность, а платной службе данных может потребоваться ограничить доступ к определенным записям.
Как определить ограничение тока
Подобно разрешениям и аутентификации, регулирование в среде REST всегда определяется как список классов.
Каждый ограничительный клапан в списке проверяется перед запуском основной части представления. Если какая-либо проверка предела тока не пройдена,exceptions.Throttled
исключение, и тело этого представления больше не будет выполняться.
Установить текущую политику ограничения
можно использоватьDEFAULT_THROTTLE_CLASSES
а такжеDEFAULT_THROTTLE_RATES
Параметр Глобально задает политику регулирования по умолчанию. Например:
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day'
}
}
DEFAULT_THROTTLE_RATES
Используемые описания частот могут включатьsecond
,minute
,hour
илиday
как срок давности.
Вы также можете использоватьAPIView
Класс представлений, который устанавливает политики регулирования для каждого представления или набора представлений.
from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView
class ExampleView(APIView):
throttle_classes = (UserRateThrottle,)
def get(self, request, format=None):
content = {
'status': 'request was permitted'
}
return Response(content)
или на основе@api_view
Установите функцию представления декоратора.
@api_view(['GET'])
@throttle_classes([UserRateThrottle])
def example_view(request, format=None):
content = {
'status': 'request was permitted'
}
return Response(content)
Как идентифицировать клиентов
X-Forwarded-For
HTTP заголовки иREMOTE_ADDR
Переменные WSGI используются для уникальной идентификации IP-адреса клиента, используемого для регулирования. если он существуетX-Forwarded-For
header , он будет использоваться, в противном случае он будет использоваться в среде WSGI.REMOTE_ADDR
значение переменной.
Если вам нужно строго идентифицировать уникальный IP-адрес клиента, вам необходимо установитьNUM_PROXIES
параметр для настройки количества прокси-серверов приложений, которые запускает API. Параметр должен быть целым числом от нуля или больше. Если установлено значение, отличное от нуля, IP-адрес клиента будет идентифицирован какX-Forwarded-For
Последний IP-адрес в заголовке. Если установить в ноль, тоREMOTE_ADDR
Значение всегда будет использоваться для идентификации IP-адреса.
Важно понимать, что если вы настроитеnum_proxy
установлено, то все клиенты за уникальным шлюзом NAT будут рассматриваться как один клиент.
оX-Forwarded-For
О том, как работает заголовок, и о том, как определить IP-адрес удаленного клиента, можно узнать по адресунашел здесь.
установить кеш
Классы регулирования, предоставляемые инфраструктурой REST, используют серверную часть кэширования Django. Вы должны убедиться, что вы установили соответствующие параметры кэша. Для простой настройки,LocMemCache
Значения по умолчанию для бэкенда должны быть в порядке. Подробнее см.Кэшированные документы Django.
Если вам нужно использовать'default'
помимо кеша, вы можете создать собственный класс ограничения тока и установитьcache
свойства для достижения. Например:
class CustomAnonRateThrottle(AnonRateThrottle):
cache = get_cache('alternate')
Вы также должны помнить'DEFAULT_THROTTLE_CLASSES'
Установите пользовательский класс ограничения тока в ключе настроек или используйтеthrottle_classes
Посмотреть свойства.
Справочник по API
AnonRateThrottle
AnonRateThrottle
Неавторизованные пользователи будут ограничены навсегда. Ограничьте, сгенерировав уникальный ключ из IP-адреса входящего запроса.
Допустимая частота запросов определяется одним из следующих (в порядке предпочтения).
- Категория
rate
Атрибут, может быть унаследованAnonRateThrottle
и установите свойства для предоставления. -
DEFAULT_THROTTLE_RATES['anon']
настраивать.
Если вы хотите ограничить частоту запросов из неизвестных источников,AnonRateThrottle
подходит.
UserRateThrottle
UserRateThrottle
Ограничьте пользовательские запросы заданной частотой запросов через API. Идентификатор пользователя используется для создания уникального ключа для ограничения. Не прошедшие проверку подлинности запросы будут использовать IP-адрес входящего запроса для создания уникального ключа для регулирования.
Допустимая частота запросов определяется одним из следующих (в порядке предпочтения).
- Категория
rate
свойства, которые могут быть унаследованы черезUserRateThrottle
и установите свойства для предоставления. -
DEFAULT_THROTTLE_RATES['user']
настраивать.
API может иметь несколько параллельныхUserRateThrottles
. Для этого наследуйтеUserRateThrottle
И установите уникальную «область» для каждого класса.
Например, несколько пользовательских уровней регулирования могут быть достигнуты с помощью следующих классов...
class BurstRateThrottle(UserRateThrottle):
scope = 'burst'
class SustainedRateThrottle(UserRateThrottle):
scope = 'sustained'
...и следующие настройки.
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'example.throttles.BurstRateThrottle',
'example.throttles.SustainedRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
'burst': '60/min',
'sustained': '1000/day'
}
}
Если вам нужен простой глобальный лимит скорости для каждого пользователя, тогдаUserRateThrottle
подходит.
ScopedRateThrottle
ScopedRateThrottle
Классы можно использовать для ограничения доступа к определенным частям API. только если доступ к представлению содержит.throttle_scope
Это ограничение применяется только в том случае, если свойство установлено. Затем формируется уникальный ключ регулирования путем объединения запрошенного «диапазона» с уникальным идентификатором пользователя или IP-адресом.
Допустимая частота запросов определяется выражениемDEFAULT_THROTTLE_RATES
Настройка Используйте ключ в запросе «диапазон», чтобы определить.
Например, учитывая следующее представление...
class ContactListView(APIView):
throttle_scope = 'contacts'
...
class ContactDetailView(APIView):
throttle_scope = 'contacts'
...
class UploadView(APIView):
throttle_scope = 'uploads'
...
...и следующие настройки.
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.ScopedRateThrottle',
),
'DEFAULT_THROTTLE_RATES': {
'contacts': '1000/day',
'uploads': '20/day'
}
}
пара пользователейContactListView
илиContactDetailView
будет ограничено 1000 запросов в день. пара пользователейUploadView
будет ограничено 20 запросами в день.
Пользовательский ограничитель тока
Чтобы настроить регулирование, наследуйтеBaseThrottle
класс и реализовать.allow_request(self, request, view)
метод. Если запрос разрешен, метод должен вернутьTrue
, иначе возвратFalse
.
Кроме того, вы также можете переопределить.wait()
метод.如果实现,.wait()
Должен вернуть количество секунд, ожидающих следующего запроса, или вернутьNone
. если.allow_request()
ранее вернулсяFalse
, то только звонки.wait()
метод.
если.wait()
метод реализован и запрос ограничен, тоRetry-After
заголовки будут включены в ответ.
взять каштан
Ниже приведен пример регулирования, которое случайным образом контролирует 1 из каждых 10 запросов.
import random
class RandomRateThrottle(throttling.BaseThrottle):
def allow_request(self, request, view):
return random.randint(1, 10) != 1