Django Middleware не может правильно обрабатывать функции просмотра - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь выполнить вход / выход из системы, используя Django Middleware. Я прошел несколько уроков, но все они опубликованы со старыми версиями. Я пытаюсь жестко закодировать функцию исключений в промежуточном программном обеспечении вместо того, чтобы указывать в файле setting.py следующее:

middleware.py:

EXEMPT_FUNC = ['Accounts:login', 'Accounts:logout', 'Accounts:register']

class LoginRequiredMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        assert hasattr(request, 'user')
        path = request.path_info.lstrip('/')
        url_is_exempt = any(url.match(path) for url in EXEMPT_FUNC)

        if path == reverse('Accounts:logout').lstrip('/'):
            logout(request)

        if request.user.is_authenticated() and url_is_exempt:
            return redirect('User:home')
        elif request.user.is_authenticated() or url_is_exempt:
            return None
        else:
            return redirect('Accounts:login')

url.py:

app_name = 'Accounts'
urlpatterns = [
    path('login', views.login_view, name='login'),
    path('logout', views.logout_view, name='logout'),
    path('register', views.register_view, name='register')
]

Вышеуказанный код не работает должным образом, пожалуйста, помогите, что я делаю не так.

Действительно признателен за вашу помощь.

1 Ответ

0 голосов
/ 20 апреля 2020

Наконец-то работает. Вот что я изменил.

middleware.py:

import re

from django.conf import settings
from django.urls import reverse
from django.shortcuts import redirect
from django.contrib.auth import logout

from Accounts import views

EXEMPT_PATH = ['login', 'logout', 'register']

class LoginRequiredMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        assert hasattr(request, 'user')
        path = request.path_info.lstrip('/')
        exempt = False

        if path in EXEMPT_PATH:
            exempt = True

        if path == 'logout':
            logout(request)

        if request.user.is_authenticated and exempt:
            return redirect('User:home')
        elif request.user.is_authenticated or exempt:
            return None
        else: 
            return redirect('Accounts:login')

При таком подходе мне не нужно изменять settings.py.

Надеюсь, это поможет.

...