问题描述
我公司的一个项目是在 Django 中,我被分配到一个任务“向顶级路由器添加身份验证”,所以我们不要忘记为每个视图添加一个身份验证代码,例如:
if not request.user.is_authenticated:
return HttpResponseRedirect('/admin/login/?next=/admin/some-page/')
经过一番研究后,我发现这可以通过编写自己的中间件来实现。在做功课之前,我根本不熟悉这个概念。因此,现在我正在尝试编写一个 LoginrequiredMiddleware
类,该类拦截每个请求并将用户发送到未通过身份验证的登录页面,并在身份验证后发送到用户尝试访问的原始页面。
这是我目前的代码。
middleware.py
from django.conf import settings
from django.http import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin
from django.utils.http import is_safe_url
import re
EXEMPT_URLS = [re.compile(settings.LOGIN_REDIRECT_URL.lstrip('/'))] # '/admin'
class LoginrequiredMiddleware(MiddlewareMixin):
def process_request(self,request):
assert hasattr(request,'user'),"The Login required Middleware"
if not request.user.is_authenticated:
path = request.path_info.lstrip('/')
if not any(m.match(path) for m in EXEMPT_URLS):
redirect_to = settings.LOGIN_REDIRECT_URL
if len(path) > 0 and is_safe_url(
url=request.path_info,allowed_hosts=request.get_host()):
redirect_to = f"{settings.LOGIN_REDIRECT_URL}/login?next={request.path_info}"
return HttpResponseRedirect(redirect_to)
我已经在 MIDDLEWARE
的 settings.py
列表中注册了中间件,并同时包含了 SessionMiddleware
和 AuthenticationMiddleware
,但我还没有设法让它工作。我可以在隐身模式下访问需要身份验证的页面,例如,无需登录。
我想要一些关于我做错了什么或我应该遵循的更好路径的提示。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)