Фреймворк Django REST Framework: "Скорость регулирования по умолчанию не установлена для области "регистрация"", даже если область определена

Я пытаюсь применить пользовательское регулирование для конечной точки регистрации в моем Django REST Framework API.

Цель состоит в том, чтобы разрешить анонимным пользователям только 5 попыток регистрации в час.

Я создал класс SignupRateThrottle, который устанавливает scope = "регистрация" и включил его в DEFAULT_THROTTLE_CLASSES. Я также добавил "регистрация": "5/час" в поле DEFAULT_THROTTLE_RATES в моем settings.py.

Однако, когда я отправляю запрос в /api/v1/auth/signup/, я получаю эту ошибку:

Неправильно сконфигурировано: скорость регулирования по умолчанию не установлена для области "регистрация"

Несмотря на то, что я уже установил скорость сброса для регистрации в своих настройках.

Я дважды проверил, что:

Написание слова "регистрация" везде совпадает.

Перезапуск сервера это не исправляет.

Ошибка возникает при запросе GET, но я намеревался ограничить только запросы POST.

То, что я ожидал:

Ограничение должно применяться только к запросам POST. После 5 регистраций в течение часа DRF должен возвращать 429 запросов, что слишком много.

Что происходит вместо этого:

Я немедленно получаю сообщение об ошибке "Неправильно сконфигурировано".

Что я пробовал:

Добавлено "регистрация": "5/час" в REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"]."].

Перезапускал сервер несколько раз.

Проверено, что значение scope = "регистрация" соответствует как классу дроссельной заслонки, так и настройкам.

Попробовал удалить другие пользовательские настройки из DEFAULT_THROTTLE_CLASSES, чтобы устранить проблему

Установка параметра DEFAULT_THROTTLE_CLASSES устанавливает логику регулирования глобально, поэтому вы получаете ее в запросах GET.

*Политика регулирования по умолчанию может быть установлена глобально с использованием параметров DEFAULT_THROTTLE_CLASSES и DEFAULT_THROTTLE_RATES.. (*https://www.django-rest-framework.org/api-guide/throttling)

Чтобы сделать это на основе одного представления, я предлагаю сделать что-то вроде этого...

#<app_name>/views.py
from <app_name>.throttles import MyThrottle

@api_view(['POST'])
@throttle_classes([MyThrottle])
def signup(request):
    #...

... и установите только значение DEFAULT_THROTTLE_RATES для области "регистрация".

Я не смог воссоздать неправильно настроенное поведение, о котором вы упомянули. Я бы убедился, что вы правильно создали свой класс Throttle, а переменные установлены внутри переменной REST_FRAMEWORK.

Это реализация, которая сработала с моей стороны:

#<app_name>/throttles.py
from rest_framework.throttling import AnonRateThrottle

class MyThrottle(AnonRateThrottle):
    scope = 'custom'
#settings.py

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES': {
        'custom': '1/min'
    }}

Надеюсь, это поможет.

Вернуться на верх