【问题标题】:Django 3.2.8 custom middleware returns 302 redirect errorsDjango 3.2.8 自定义中间件返回 302 重定向错误
【发布时间】:2021-10-23 22:58:30
【问题描述】:

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

【问题讨论】:

    标签: django django-middleware django-3.2


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 2014-11-13
      • 2011-05-17
      相关资源
      最近更新 更多