自定义中间件阻止了我的密码重置视图

时间:2019-01-16 07:13:24

标签: django django-views django-authentication django-middleware

我制作了一个自定义中间件软件来立即保护我的所有视图,并制作了一个自定义装饰器来豁免loginregister/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

2 个答案:

答案 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