Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重定向到带有中间件的登录页面导致';“重定向太多”;问题_Python_Django_Redirect - Fatal编程技术网

Python 重定向到带有中间件的登录页面导致';“重定向太多”;问题

Python 重定向到带有中间件的登录页面导致';“重定向太多”;问题,python,django,redirect,Python,Django,Redirect,我想要的是,如果用户未经身份验证,则将其重定向到登录页面。我制作了一个中间件,但重定向不起作用。谁能帮我一个忙吗 我的网址: from django.contrib import admin from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admi

我想要的是,如果用户未经身份验证,则将其重定向到登录页面。我制作了一个中间件,但重定向不起作用。谁能帮我一个忙吗

我的网址:

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('contas/', include('django.contrib.auth.urls'), name='login'),  # I want call this
    path('', include('apps.props.urls'))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我的中间件.py

from django.http import HttpResponseRedirect
from django.urls import reverse


class AuthRequiredMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if not request.user.is_authenticated:
            return HttpResponseRedirect(reverse('login'))  # Here I call login
        response = self.get_response(request)
        return response
最后是my 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',
    'middleware.AuthRequiredMiddleware',  # Registering middleware
]
我得到的是这个页面“重定向太多”

我的日志:


对@Melvyn和@Onsem的评论,我已经改进了我的代码。这里有一个解决方案(我们只需要小心处理介质文件夹中的文件,它们是以匿名用户身份访问的):


想一想。1, 2, 3. 不好的,您将未经身份验证的人发送到登录页面。当他到达那里时,他没有经过身份验证,因此您将他发送到登录页面。当他到达那里时,他没有被授权,所以你把他发送到登录页面。当他到达那里时,他没有被授权,所以你把他发送到登录页面。当他到达那里时,他没有被授权,所以你把他发送到登录页面。当他到达那里时,他没有被授权,所以你把他发送到登录页面。当他到达那里时,他还没有被认出,所以你把他送到长滩去!我会想出一个解决方案。你的中间件也会应用到登录视图本身,所以它永远不会“到达”登录视图,因为即使登录也会继续重定向到登录。
from django.http import HttpResponseRedirect
from django.urls import reverse


class AuthRequiredMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Here I call login if not authenticated and request is not login page
        if not request.user.is_authenticated and request.path != reverse('login'):
            return HttpResponseRedirect(reverse('login'))  
        response = self.get_response(request)
        return response