Фреймворк 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'
}}
Надеюсь, это поможет.