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.

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