Вот почему вы получаете эту ошибку.
Зависимые библиотеки
Я провел поиск по Именам классов, чтобы найти, какие библиотеки вы использовали, чтобы я мог воссоздать проблему на моей машине. Библиотека, вызывающая проблему, называется keycloak_idc
. Эта библиотека устанавливает другую библиотеку mozilla_django_oidc
, которая, по-видимому, и является причиной того, что вы получаете это.
Почему эта библиотека вызывает проблему
Внутри README
файл этой библиотеки, он дает вам инструкции о том, как его настроить. Они находятся в этом файле. Внутри этих инструкций он дал указание добавить AUTHENTICATION_BACKENDS
AUTHENTICATION_BACKENDS = [
'keycloak_oidc.auth.OIDCAuthenticationBackend',
...
]
. При добавлении этого бэкэнда аутентификации все ваши запросы проходят через промежуточное программное обеспечение, определенное внутри класса SessionRefresh
, определенного внутри mozilla_django_oidc/middleware.py
. Внутри этого класса всегда вызывается метод process_request()
.
Первое, что делает этот метод, вызывает метод is_refreshable_url()
, который всегда возвращает False, если метод запроса был POST. В противном случае (когда метод запроса GET), он вернет True.
Теперь тело этого условия if было следующим:
if not self.is_refreshable_url(request):
LOGGER.debug('request is not refreshable')
return
# lots of stuff in here
return HttpResponseRedirect(redirect_url)
Так как это промежуточное ПО, если запрос было POST, а возвращение было None, Django просто продолжит выполнение вашего запроса. Однако, когда запрос GET и вместо этого запускается строка return HttpResponseRedirect(redirect_url)
, Django даже не продолжит вызывать ваше представление и немедленно возвратит ответ 302.
Решение
После нескольких часов отладки я не вижу точной логики c в этом промежуточном программном обеспечении или что именно вы пытаетесь сделать, чтобы найти конкретное решение, поскольку все это началось с догадок, но наивно Исправить может быть то, что вы удалите AUTHENTICATION_BACKENDS
из вашего файла настроек. Хотя я чувствую, что это неприемлемо, возможно, вы можете попробовать использовать другую библиотеку, которая выполняет то, что вы пытаетесь сделать, или найти альтернативный способ сделать это. Также, возможно, вы можете связаться с автором и посмотреть, что они думают.