Пользовательское промежуточное ПО, блокирующее мой вид сброса пароля - PullRequest
0 голосов
/ 16 января 2019

Я создал Custom Middelware , чтобы защитить все мои виды сразу, и сделал собственный декоратор, чтобы исключить функции login и register/signup, чтобы они были доступны для посетителей. Но когда я попытался сбросить пароль с помощью password-reset, я не смог, так как он перенаправил меня на страницу входа, эта система работала раньше, когда я не поместил Custom middelware в settings.py

Middleware.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)

Settings.py

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 , используя мой Login_exempt Custom Decorator. ТИА

привязки

from django.urls import path,include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
path('admin/', admin.site.urls),
path('', include("myapp.urls")),
path('accounts/', include('django.contrib.auth.urls'))


] 


if settings.DEBUG:


urlpatterns += (static(settings.STATIC_URL,document_root=settings.STATIC_ROOT))

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Для этого вы можете использовать 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

0 голосов
/ 16 января 2019

Вы можете добавить виды просмотра 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 или имени представления в промежуточном программном обеспечении, но все же, возможно, самым чистым будет использование вашего декоратора и добавление необходимых представлений один за другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...