Django 3.2.8 自定义中间件 returns 302 重定向错误

Django 3.2.8 custom middleware returns 302 redirect errors

如果用户的个人资料角色值设置为“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