繁体   English   中英

Django 需要登录错误 ERR_TOO_MANY_REDIRECTS

[英]Django login required error ERR_TOO_MANY_REDIRECTS

我的 django 应用程序在使用 LoginRequiredMiddleware 之前运行良好,在我使用 LoginRequiredMiddleware 之后出现此错误。

This page isn’t working 
127.0.0.1 redirected you too many times.
Try clearing your cookies.
ERR_TOO_MANY_REDIRECTS

设置.py

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'login_required.middleware.LoginRequiredMiddleware',
# 'debug_toolbar.middleware.DebugToolbarMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

REPORT_BUILDER_ASYNC_REPORT = True
WSGI_APPLICATION = 'mymachine.wsgi.application'
CRISPY_TEMPLATE_PACK = 'bootstrap4'
LOGIN_REDIRECT_URL = 'index'
LOGOUT_REDIRECT_URL = 'login'
LOGIN_URL = 'login'
CSRF_COOKIE_HTTPONLY = False

url.py

urlpatterns = [
path('login/', LoginView.as_view(), name='login'),
path('logout/', LogoutView.as_view(), name='logout'),
path('', IndexView.as_view(), name='index'),
]

视图.py

class LoginView(CreateView):
"""
Login
"""
template_name = "registration/login.html"
defaults = dict()

def __init__(self, **kwargs):
    super(LoginView, self).__init__(**kwargs)

def on_create(self, request, *args, **kwargs):
    return render(request, self.template_name, self.defaults)

def init_component(self, request):
    logout(request)
    self.defaults['name_space'] = reverse('auth')
    self.defaults['form'] = LoginForm

def get(self, request, *args, **kwargs):
    self.init_component(request)
    return self.on_create(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
    form = LoginForm(request.POST)
    if form.is_valid():
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user:
            login(request, user)
            request.session["company_id"] = 1
            return redirect(settings.LOGIN_REDIRECT_URL)
        elif user is None:
            context = {'name_space': reverse('auth'), 'form': LoginForm,
                       'message': _("username or password is incorrect"), 'add': 'try Again'}
            return render(request, 'registration/login.html', context)

这是 chrome 中出现的 url。

http://127.0.0.1:4050/login/?next=/login/

我已经尝试过 web 中的答案,但没有一个有效,请帮助解决这个问题,提前谢谢你。

中间件适用于每个请求/响应,因为您添加了LoginRequiredMiddleware它将重定向到登录页面但您没有经过身份验证,因此您将再次被重定向到登录页面。 这个 url http://127.0.0.1:4050/login/?next=/login/本身解释了这里发生了什么。 您正在访问登录页面,但您再次被重定向到登录页面。

我认为您正在使用此 repo django-login-required-middleware ,在他们的自述文件中明确提到

要在视图中忽略身份验证,请使用装饰 @login_not_required 用于 FBV 或 LoginNotRequiredMixin 用于 CBV:

您需要将LoginView更改为:

from login_required import LoginNotRequiredMixin
class LoginView(LoginNotRequiredMixin, CreateView):
"""
Login
"""
... // Rest of the code

您还可以添加应忽略LoginRequired的 url 列表

LOGIN_REQUIRED_IGNORE_PATHS = [
    r'/accounts/logout/$'
    r'/accounts/signup/$',
    r'/admin/$',
    r'/admin/login/$',
    r'/about/$'
]

或添加LOGIN_REQUIRED_IGNORE_VIEW_NAMES设置。 任何与这些 url 名称匹配的请求都将被忽略。 此设置应该是一个列表,其中包含 url 名称。

LOGIN_REQUIRED_IGNORE_VIEW_NAMES = [
    'home',
    'login',
    'admin:index',
    'admin:login',
    'namespace:url_name',
]

由于某种原因,您似乎使用了 package django-login-required-middleware ,它提供了一个中间件,因此所有视图都需要登录。 正在发生的事情是中间件假设即使您的登录视图也需要用户登录。

您可以使用 package 提供的LoginNotRequiredMixin (或基于 function 的视图的login_not_required装饰器)(参考django-login-required-middleware [GitHub] )来停止此操作:

from login_required import LoginNotRequiredMixin


class LoginView(LoginNotRequiredMixin, CreateView):
    # Your code here

虽然这解决了这个问题,你甚至需要使用这个 package 吗? 我会假设login_required 装饰器LoginRequired mixin通常应该足以确保用户登录到需要它的视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM