我正在进行涉及用户身份验证的练习。一切顺利,但当我退出时,应用程序进入循环,在控制台上显示此消息:
[04/Apr/2018 22:44:14] "GET /account/logged_out/ HTTP/1.1" 302 0
[04/Apr/2018 22:44:14] "GET /account/logged_out/ HTTP/1.1" 302 0
[04/Apr/2018 22:44:14] "GET /account/logged_out/ HTTP/1.1" 302 0
settings.py 文件的末尾
from django.urls import reverse_lazy
LOGIN_REDIRECT_URL = reverse_lazy('account:dashboard')
LOGIN_URL = reverse_lazy('account:login')
LOGOUT_REDIRECT_URL = reverse_lazy('account:logout')
urls.py 文件
from django.contrib.auth import views as auth_views
from django.urls import path
from . import views
app_name = 'account'
urlpatterns = [
# path('login/', views.user_login, name='login'),
path('', views.dashboard, name='dashboard'),
# login / logout urls
path('login/', auth_views.LoginView.as_view(template_name='registration/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='registration/logged_out.html'), name='logout'),
views.py 文件
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.shortcuts import render
@login_required
def dashboard(request):
return render(request, 'account/dashboard.html', {'section': 'dashboard'})
base.html 模板
{% load staticfiles %}
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="{% static "css/base.css" %}">
</head>
<body>
<div id="header">
<span class="logo">Bookmarks</span>
{% if request.user.is_authenticated %}
<ul class="menu">
<li> {% if section == "dashboard" %}class="selected"{% endif %}><a href="{% url "account:dashboard" %}">My dashboard</a></li>
<li> {% if section == "images" %}class="selected"{% endif %}<a href="#">Images</a></li>
<li> {% if section == "people" %}class="selected"{% endif %}<a href="#">People</a></li>
</ul>
{% endif %}
<span class="user">
{% if request.user.is_authenticated %}
Hello {{ request.user.first_name }}, <a href="{% url "account:logout %}">Logout</a>
{% else %}
<a href="{% url "account:dashboard" %}"></a>
{% endif %}
</span>
</div>
<div id="content">
{% block content %}
{% endblock %}
</div>
</body>
</html>
我的猜测是LOGOUT_REDIRECT_URL在注销到注销网址后不断重定向,而LOGOUT_REDIRECT_URL一次又一次地重做。
处理这种情况的最正确方法是什么?
感谢您的帮助。非常感谢!
答案 0 :(得分:0)
正如您所说:LOGOUT_REDIRECT_URL = reverse_lazy('account:logout')
表示您想要重定向到logout
视图。您应该将此设置更改为其他视图,例如登录视图:
LOGOUT_REDIRECT_URL = reverse_lazy('account:login')
如果你想显示默认的Django logged_out.html
模板,你不应该重定向,它是默认情况下退出视图(即删除LOGOUT_REDIRECT_URL
)的设置。
如果您想显示自己的自定义模板,请在其中一个模板目录中覆盖Django的registration/logged_out.html
模板(同样,从设置中删除LOGOUT_REDIRECT_URL
),或创建自己的{ {1}}为此并重定向到您创建的新视图。
答案 1 :(得分:0)
LOGIN_URL和LOGIN_REDIRECT_URL接受命名的URL模式。这意味着您只需要在setrings中写入URL名称。 这应该可以解决您的错误。
LOGIN_URL = 'login' # url name
LOGOUT_REDIRECT_URL = 'logout'
答案 2 :(得分:0)
注销后必须重定向到登录名:
LOGOUT_REDIRECT_URL = reverse_lazy('account:login')
您还可以做的是添加一些查询参数,以便在注销后通过消息个性化登录。
使用类似这样的功能:
from django.utils.http import urlencode
def my_reverse(viewname, kwargs=None, query_kwargs=None):
"""
Custom reverse to add a query string after the url
Example usage:
url = my_reverse('my_test_url', kwargs={'pk': object.id}, query_kwargs={'next': reverse('home')})
"""
url = reverse(viewname, kwargs=kwargs)
if query_kwargs:
return u'%s?%s' % (url, urlencode(query_kwargs))
return url
然后你可以做
LOGOUT_REDIRECT_URL = my_reverse("account:login", query_kwargs={'logoutMessage': True})
在登录视图中,您可以获取查询参数并在上下文中添加消息以在模板中呈现
答案 3 :(得分:0)
问题是settings.py中INSTALLED_APPS列表的顺序。我的应用程序应该在Django的默认应用程序之上。现在正在覆盖Django的原始logged_out.html模板。
这里的帖子有原始答案: https://stackoverflow.com/a/35157729/6329996
这里INSTALLED_APPS列表工作:
INSTALLED_APPS = [
# My Apps
'account',
# Django Apps
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]