Задать вопрос
Hackerman1
@Hackerman1
17 лет, плохое зрение.

Почему второй декоратор вызывается дважды?

У меня есть два декоратора.
@csrf_exempt
@RateLimitMiddleware
def add_user(r):
    if r.method == "POST":
        if r.headers.get("Token") == Token:
            data_dict = json.loads(r.body)
            answer = VerificationCodes.send_code(data_dict.get('email'),
                                                 data_dict.get('username'), data_dict.get('password'))
            return HttpResponse(json.dumps(answer[0]), status=answer[1])
        else:
            return HttpResponse("<h1>I don't know who you are!</h1>", status=401)
    else:
        return HttpResponse("<h1>You picked the wrong method, fool!</h1>", status=405)

В таком порядке второй декоратор вызывается дважды, не знаю ,почему. Если их поменять местами, то не срабатывает отключение проверки CSRF. Код мидлваря приложил ниже. Раньше работало нормально, а щас через пень колоду.
class RateLimitMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        ip_address = request.META.get('REMOTE_ADDR')
        key = f'ratelimit_{ip_address}'

        if cache.get(key):
            return HttpResponse("Too many requests", status=429)

        cache.set(key, 1, 2)  # Задаем таймаут в секундах

        response = self.get_response(request)
        return response
  • Вопрос задан
  • 108 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Hackerman1
@Hackerman1 Автор вопроса
17 лет, плохое зрение.
Я сам нашел ответ случайным образом. Дело оказалось в том, что я зарегистрировал этот класс в settings.py как мидлварь, и в придачу записал как декоратор перед нужной мне функцией. Вследствие этого этот класс использовался и как мидлварь для всех запросов, и как декоратор для той функции, поэтому вызывался дважды. Я убрал запись как мидлваря из settings.py и теперь всё работает
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
поди стандартно, не два раза вызывается, а твой браузер еще и favicon запросил, в итоге тебе сразу два запроса прилетело, смотри логи
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы