【问题标题】:Getting 'ERR_TOO_MANY_REDIRECTS' error when using custom Middleware in Django在 Django 中使用自定义中间件时出现“ERR_TOO_MANY_REDIRECTS”错误
【发布时间】:2020-05-16 14:46:57
【问题描述】:

当用户未通过身份验证时,我正在尝试使用自定义中间件来限制页面访问。 我在“settings.py”中定义了一个应该不受此限制的 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/$',
]

中间件.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】:

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

    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)
    

    【讨论】:

    • 感谢您的快速回复。但是当我用你的 sn-p 替换我的代码时,中间件让我无需身份验证即可访问所有页面。我错过了什么?
    • 尝试去掉最后的 return None
    • 删除 None 再次给我 'ERR_TOO_MANY_REDIRECTS'
    猜你喜欢
    • 2021-03-09
    • 2015-05-29
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多