在Django中使用自定义中间件时出现'ERR_TOO_MANY_REDIRECTS'错误

问题描述 投票:0回答:1

当用户未通过身份验证时,我试图使用自定义中间件来限制页面访问。我在“ settings.py”中定义了一个URL列表,这些URL应该不受此限制。但是,当我尝试访问任何页面时,都会收到“ ERR_TOO_MANY_REDIRECTS”错误。如果需要,请随时要求更多的说明和代码参考。

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',
    'accounts.middleware.LoginRequiredMiddleware',
]

LOGIN_URL = 'home'
LOGIN_REDIRECT_URL = '/'

LOGIN_EXEMPT_URLS = [
    r'^accounts/login/$',
    r'^accounts/register/$',
    r'^accounts/logout/$',
]

middleware.py

import re
from django.conf import settings
from django.shortcuts import redirect

EXEMPT_URLS = []

if hasattr(settings, 'LOGIN_EXEMPT_URLS'):
    EXEMPT_URLS += [re.compile(url) for url in settings.LOGIN_EXEMPT_URLS]

class LoginRequiredMiddleware:
    def __init__(self, get_response):
        print('inside init')
        self.get_response = get_response

    def __call__(self, request):
        print('inside call')
        response = self.get_response(request)
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        print('inside view_process')
        path = request.path_info.lstrip('/')
        print(path)

        #assert hasattr(request, 'user')

        if not request.user.is_authenticated:
            print('user not authenticated')
            if not any(url.match(path) for url in EXEMPT_URLS):
                print('redirecting to login url')
                return redirect(settings.LOGIN_URL)

urls.py

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name = 'home'),
    path('product', views.product, name = 'product'),
    path('createOrder', views.createOrder, name = 'createOrder'),
    path('updateOrder/<str:pk>', views.updateOrder, name = 'updateOrder'),
    path('deleteOrder/<str:pk>', views.deleteOrder, name = 'deleteOrder'),
    path('register', views.register, name = 'register'),
    path('login', views.login, name = 'login'),
    path('logout', views.logout, name = 'logout')
]

python django python-3.x django-middleware login-required
1个回答
0
投票

只需将您的中间件替换为以下内容:

class LoginRequiredMiddleware:
    def process_request(self, request):
        if not request.user.is_authenticated:
            if not any(url.match(request.path_info.lstrip('/')) for url in EXEMPT_URLS):
                return redirect(settings.LOGIN_URL)
© www.soinside.com 2019 - 2024. All rights reserved.