django - 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
。
推荐阅读
- electron - 为什么 nyc 只从我的 Electron 进程的主进程中捕获文件?
- python - 将两个连续的词视为词频中的一个
- sql - Postgresql“+”符号用于回车/zsh脚本的新行
- javascript - 为什么我不能在 jasmine 的 expectAsync 中使用匿名函数?
- mips - 我如何将 1 添加到内存中的第一个值并将该值存储在相邻的单词中,并将该值的副本放入寄存器 $v0
- javascript - 从@符号导入Javascript Vue
- java - 给定一个字符串数组,编写一个递归方法,在 O(n) 中搜索给定字符串并返回索引。LMK 如何修复错误
- mysql - 如何在超聚合行中保持其“NULL”值的同时重命名“group by with rollup”列名
- ios - 如何确定哪个 Core Data 可转换属性未使用安全编码
- pointers - Dart 编程中的链表,如何处理 Dart 中的指针或如何在 Heap 上存储变量?