Руководство по API платформы Django REST (15): регулирование

задняя часть Python Django

Официальная оригинальная ссылка
Эта серия статей адрес 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-ForHTTP заголовки иREMOTE_ADDRПеременные WSGI используются для уникальной идентификации IP-адреса клиента, используемого для регулирования. если он существуетX-Forwarded-Forheader , он будет использоваться, в противном случае он будет использоваться в среде 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