我制作了一个自定义中间件软件来立即保护我的所有视图,并制作了一个自定义装饰器来豁免login
和register/signup
函数,以便访问者可以访问它们。但是,当我尝试使用password-reset
重设密码时,由于无法将我重定向到登录页面,因此无法进行操作,因为我没有将我的 Custom middelware 放在{ {1}}
Middleware.py
settings.py
Settings.py
from django.contrib.auth.decorators import login_required
def login_exempt(view): # <-- Custom Decorator
view.login_exempt = True
return view
class LoginRequiredMiddleware: # <-- Custom Middleware
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_view(self, request, view_func, view_args, view_kwargs):
if getattr(view_func, 'login_exempt', False):
return
if request.user.is_authenticated:
return
return login_required(view_func)(request, *view_args, **view_kwargs)
]
现在,如果我删除了自定义中间件,则可以访问我的MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
#custom auth middleware
'dashboard.middleware.LoginRequiredMiddleware',
。因此,我该怎么做才能使用我的password-reset
自定义装饰器排除 Auth Views 。 TIA
UrlCONF
Login_exempt
答案 0 :(得分:0)
您可以将Django的身份验证视图一个一个地添加到您的urlpatterns
中,并用login_exempt
装饰每个。
如果您希望将检查移入中间件,则可以尝试以下操作:
# urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', include("myapp.urls")),
path('accounts/', include('django.contrib.auth.urls', namespace="accounts"))
]
# middleware.py
class LoginRequiredMiddleware: # <-- Custom Middleware
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_view(self, request, view_func, view_args, view_kwargs):
if getattr(view_func, 'login_exempt', False):
return
if 'accounts' in request.resolver_match.namespaces:
return
其他可能性可能是检查中间件中的url或视图名称,但也许最干净的方法是使用装饰器并逐个添加必要的视图。
答案 1 :(得分:0)
您可以为此使用django-decorator-include。
pip install django-decorator-include
在您 project/url.py
from decorator_include import decorator_include
from project/custom_middleware import login_exempt
urlpatterns = [
path('admin/', admin.site.urls),
path('', include("myapp.urls")),
# do this
path('accounts/', decorator_include(login_exempt, 'django.contrib.auth.urls'))
]
请不要忘记将软件包添加到 requirements.txt