Django 3.2.8 пользовательское промежуточное ПО возвращает ошибки 302 редиректа
Я хочу использовать пользовательское промежуточное ПО для перенаправления пользователя на роль его профиля, если значение роли профиля установлено в '0'.
Ниже приведен текущий код, который я использую, но он вызывает цикл 302 редиректа. Это основано на других примерах, которые я нашел в интернете, но мне не повезло найти исправление.
Любые идеи будут высоко оценены.
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponseRedirect
class UserRoleMiddleware(MiddlewareMixin):
def __init__(self, get_response):
self.get_response = get_response
def process_request(self, request):
redirect_url = '/role/'
if request.user.is_authenticated and request.user.profile.role == '0':
print('user must define a role')
return HttpResponseRedirect(redirect_url)
return None
Ответ:
[23/Oct/2021 23:00:50] "GET /role/ HTTP/1.1" 302 0
user must define a role
[23/Oct/2021 23:00:50] "GET /role/ HTTP/1.1" 302 0
user must define a role
[23/Oct/2021 23:00:50] "GET /role/ HTTP/1.1" 302 0
user must define a role
[23/Oct/2021 23:00:50] "GET /role/ HTTP/1.1" 302 0
Поскольку промежуточное ПО также будет срабатывать на вашем маршруте /role/
, вам следует ввести проверку, является ли путь запроса для этого маршрута, чтобы избежать цикла.
def process_request(self, request):
redirect_url = '/role/'
if request.path == redirect_url:
return self.get_response(request)
# or check for `and request.path != redirect_url` here
if request.user.is_authenticated and request.user.profile.role == '0':
print('user must define a role')
return HttpResponseRedirect(redirect_url)
return None
Кроме того, я полагаю, что вы хотите вернуть self.get_response(request)
, а не None
.