在处理白名单内的多个 Apps 的 URL 链接时,可以采用以下几种方法来简化白名单的配置:
1. 使用 reverse
动态获取 URL
如果你在 urls.py
中为每个 App 的 URL 定义了名称(name
参数),可以使用 reverse
函数动态获取这些 URL,而不是硬编码路径。这样可以避免手动维护大量的路径字符串。
Python复制
from django.urls import reverseclass LoginRequiredMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 动态获取白名单中的 URLwhite_list = [reverse('login'), # 登录页面reverse('logout'), # 注销页面reverse('admin:index'), # Django 管理页面# 其他 App 的 URL 名称reverse('app1:view1'),reverse('app2:view2'),]# 如果用户未登录且请求的路径不在白名单中,重定向到登录页面if not request.user.is_authenticated and request.path not in white_list:return redirect('login')response = self.get_response(request)return response
2. 使用 URL 前缀匹配
如果你的多个 App 的 URL 都有共同的前缀,可以通过前缀匹配来简化白名单的配置。例如,所有以 /public/
开头的 URL 都不需要登录。
Python复制
class LoginRequiredMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 白名单前缀white_list_prefixes = ['/login/','/logout/','/admin/','/public/', # 所有以 /public/ 开头的 URL]# 检查请求路径是否以白名单前缀开头if any(request.path.startswith(prefix) for prefix in white_list_prefixes):# 如果路径以白名单前缀开头,直接放行passelif not request.user.is_authenticated:# 如果用户未登录且路径不在白名单中,重定向到登录页面return redirect('login')response = self.get_response(request)return response
3. 使用正则表达式匹配
对于更复杂的匹配需求,可以使用正则表达式来匹配多个路径模式。
Python复制
import reclass LoginRequiredMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 使用正则表达式定义白名单white_list_patterns = [re.compile(r'^/login/$'), # 匹配 /login/re.compile(r'^/logout/$'), # 匹配 /logout/re.compile(r'^/admin/'), # 匹配 /admin/ 开头的路径re.compile(r'^/public/'), # 匹配 /public/ 开头的路径]# 检查请求路径是否匹配白名单中的正则表达式if any(pattern.match(request.path) for pattern in white_list_patterns):# 如果路径匹配白名单中的正则表达式,直接放行passelif not request.user.is_authenticated:# 如果用户未登录且路径不在白名单中,重定向到登录页面return redirect('login')response = self.get_response(request)return response
4. 集中管理白名单
如果你的项目中有多个中间件都需要使用白名单,可以将白名单的配置提取到一个单独的文件中,方便集中管理和维护。
Python复制
# myproject/settings.py
# 定义白名单配置
WHITE_LIST_URLS = ['login','logout','admin:index','app1:view1','app2:view2',
]# myapp/middleware.py
from django.urls import reverse
from django.conf import settingsclass LoginRequiredMiddleware:def __init__(self, get_response):self.get_response = get_response# 动态生成白名单 URL 列表self.white_list = [reverse(url_name) for url_name in settings.WHITE_LIST_URLS]def __call__(self, request):# 如果用户未登录且请求的路径不在白名单中,重定向到登录页面if not request.user.is_authenticated and request.path not in self.white_list:return redirect('login')response = self.get_response(request)return response
通过以上方法,可以更灵活、更简洁地管理白名单中的多个 Apps 的 URL 链接,减少硬编码和重复配置。