首页 > 解决方案 > 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

标签: djangodjango-middlewaredjango-3.2

解决方案


因为中间件也会在你的/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


推荐阅读