![](/img/trans.png)
[英]ERR_TOO_MANY_REDIRECTS in redirect with middleware in Django
[英]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。
我已经尝试过 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.