当我退出应用程序进入循环203 http状态

时间:2018-04-04 21:08:49

标签: python django routing django-templates

我正在进行涉及用户身份验证的练习。一切顺利,但当我退出时,应用程序进入循环,在控制台上显示此消息:

[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

Project structure

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一次又一次地重做。

处理这种情况的最正确方法是什么?

感谢您的帮助。非常感谢!

4 个答案:

答案 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',
]