【问题标题】:Django unable to render logout templateDjango 无法呈现注销模板
【发布时间】:2016-09-18 18:27:51
【问题描述】:

有以下问题;我通过示例来关注 Django,Antonio Mele。这里的练习是设置用户登录和注销。使用默认的 contrib.auth 视图。当使用书中的代码时。注销视图是管理页面注销的视图;似乎与此处描述的问题相同

django logout redirects me to administration page。都试了都没有成功

我一直在解决这个问题。我的代码现在可以工作了,因为不再呈现管理模板。但是,我仍然无法使用自己的 logout.html。我可以重定向到我自己的 login.html... 但不能重定向到 logout.html。注销本身正在工作。用户可以使用模板登录和退出仅此问题。我现在只收到一个浏览器错误

页面未正确重定向 Iceweasel 检测到 > 服务器正在以永远无法完成的方式重定向对该地址的请求。此问题有时可能是由禁用或 >拒绝接受 cookie 引起的。

检查 cookie 可以看到 csrf 令牌被接受

没有可用的回溯没有错误:-(

如果我使用下面的代码,所有的工作都会有一个例外。我在注销时被重定向到 Django Administration 注销模板,而不是我自己的 logout.html ......这是在书中使用 coede 时......我自己修改的代码,带有单独的注销功能也无法生成最大递归错误。编辑 URLS.PY 会停止呈现管理模板。但修改后的代码似乎在网址中有问题,即.....

这不工作!!!!!

 url(r'^logout/$', 'django.contrib.auth.views.logout',{'next_page': '/account/logout'},  name='logout'),

这完美!!!!

 url(r'^logout/$', 'django.contrib.auth.views.logout',{'next_page': '/account/login'},  name='logout'),

书中代码如下

来自书籍设置.PY

from django.core.urlresolvers import reverse_lazy

LOGIN_REDIRECT_URL = reverse_lazy('dashboard')
LOGIN_URL = reverse_lazy('login')
LOGOUT_URL = reverse_lazy('logout')

来自图书浏览量.PY

from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .forms import LoginForm

@login_required
def dashboard(request):
    return render(request, 'account/dashboard.html', {'section': 'dashboard'})


def user_login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            user = authenticate(username=cd['username'], password=cd['password'])
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return HttpResponse('Authenticated successfully')
                else:
                    return HttpResponse('Disabled account')
            else:
                return HttpResponse('Invalid login')
    else:
        form = LoginForm()
    return render(request, 'account/login.html', {'form': form})

FROM BOOK MAIN URLS.PY

from django.conf.urls import include, url
from django.contrib import admin



urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^account/', include('account.urls')),
    ]

MYAPP(帐户) URLS.PY

from django.conf.urls import url
from . import views


urlpatterns = [
    # url(r'^login/$', views.user_login, name='login'),
    url(r'^$', views.dashboard, name='dashboard'),



    # login / logout urls
    url(r'^login/$', 'django.contrib.auth.views.login', name='login'),
    url(r'^logout/$', 'django.contrib.auth.views.logout', name='logout'),
    url(r'^logout-then-login/$', 'django.contrib.auth.views.logout_then_login', name='logout_then_login'),

我的修改代码

我现在在我的视图中包含了一个单独的注销定义,现在还传递了一个 {key:value} 对 {'next_page': '/account/logout'}。

如果在 urls 文件中使用并映射了 logout def,它会在 logout(request) 行产生最大递归错误

def logout(request):
    logout(request)
    request.session.flush()
    request.user = AnonymousUser
    # Redirect to a success page.
    return HttpResponseRedirect(request,'/account/logout.html',context_instance = RequestContext(request))

没有这个def,唯一产生的错误是

""" 页面未正确重定向

"""Iceweasel 检测到服务器正在以永远不会完成的方式重定向对该地址的请求。

This problem can sometimes be caused by disabling or refusing to accept cookies.""""

""" 我在浏览器中检查了 cookie,并看到 csrf_token 被接受了

对我来说奇怪的是,如果将 code: {'next_page': '/account/logout'} 更改为 {'next_page': '/account/login'} 一切正常。已经尝试了所有找到的建议,我不知道任何帮助表示赞赏....

我的代码 VIEWS.PY

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.contrib.auth import authenticate, login, logout
from .forms import LoginForm
from django.contrib.auth.decorators import login_required
from django.template import RequestContext
from django.contrib.auth.models import User


# Create your views here.

@login_required
def dashboard(request):
    return render(request, 'account/dashboard.html',{'section': 'dashboard' })




def user_login(request):
    cd = None
    if request.method=='POST':
        form  = LoginForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            user = authenticate(username=cd['username'],
                                password=cd['password'])
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return HttpResponse('Authenticated successfully')
                else:
                    return HttpResponse('Disabled Account')
            else:
                return HttpResponse('Invalid Login')
    else:
        form = LoginForm()
    return render(request, 'account/login.html',{'form': form},context_instance = RequestContext(request))


def logout(request):
    logout(request)
    request.session.flush()
    request.user = AnonymousUser
    # Redirect to a success page.
    return HttpResponseRedirect(request,'/account/logout.html',context_instance = RequestContext(request))

我的代码 帐号/urls.py

from django.conf.urls import url, patterns
from . import views 



urlpatterns = [
              # post views
              #url(r'^login/$', views.user_login, name='login'),
              # login/logout urls
              url(r'^$', views.dashboard, name='dashboard'),
              url(r'^login/$', 'django.contrib.auth.views.login', name='login'),
              url(r'^logout/$', 'django.contrib.auth.views.logout',{'next_page': '/account/logout'},  name='logout'),
              url(r'^logout-then-login/$','django.contrib.auth.views.logout_then_login', name='logout_then_login'),

              ]

我的代码 主要网址.PY

from django.conf.urls import include, url
from django.contrib import admin


urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^account/', include("account.urls")),
]

我的密码 设置.PY

LOGIN_REDIRECT_URL = reverse_lazy('dashboard')
LOGIN_URL = reverse_lazy('login')
LOGOUT_URL = reverse_lazy('logout')

INSTALLED_APPS = (
    'account',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

)

MIDDLEWARE_CLASSES = (
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)


# urlpatterns += patterns('django.contrib.auth.views',
#          #url(r'^login/$', 'login', { 'template_name': 'registration/login.html'}, name='login' ),
#          #url(r'^logout/$', 'logout', { 'template_name': 'registration/logout.html', 'next_page':reverse('index') }, name='logout' ),
#  )

我的密码
注销.html

{% extends "base1.html" %}

{% block title %}Logged Out{% endblock %}


{% block content %}
<h1>
    Logged Out
</h1>
<p>
    You have been successfully logged out. You can <a href="{% url "login" %}">Log-in again</a>
</p>{% endblock %}

我的密码 base1.html

{% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" type="text/css" href="{% static 'css/base.css' %}">
</head>
<body>


<div id="header">
    <span class="logo">
        BookMarks
    </span>
{% if user.is_authenticated %}
<ul class="menu">

<li {% if section == "dashboard" %}class="selected"{% endif %}>
<a href="{% url '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 %}

{%if user.is_authenticated %}
<span class="user">


Hello {{ user.first_name }} {{ user.last_name }},
<a href="{% url 'logout'  %}">Logout</a>

{% else %}
<a href='{% url "login" %}'>Log-in</a>
{% endif %}
</span>
</div>

<div id="content">
    {% block content %}
    {% endblock %}
</div>

</body>

</html>

【问题讨论】:

标签: python django templates


【解决方案1】:

我遇到了同样的问题,但后来我继续阅读

"如果您看到的是 Django 管理站点的注销页面而不是您自己的注销页面,请检查项目的 INSTALLED_APPS 设置并确保 django.contrib.admin 出现在帐户申请之后。这两个模板都是位于相同的相对路径中,Django 模板加载器将使用它找到的第一个。”

【讨论】:

    【解决方案2】:

    您在urls.py 中使用contrib.authlogout 视图。该视图重定向到'next_page' 指定的URL。您将'/account/logout' 提供为next_page - 再次调用logout 视图!

    这导致(无限)redirect loop:视图重定向到自身。

    尝试:在您自己的logout 视图中:

    # no redirecting here!
    return render(request, 'account/logout.html', 
                  context_instance=RequestContext(request))
    

    account/urls.py 中为该视图添加一个网址:

    url(r'^post-logout/$', logout, name='post-logout'), 
    # logout being your own view
    

    然后将该 URL 作为 'next_page' 提供给实际 (auth) 注销:

    url(r'^logout/$', 'django.contrib.auth.views.logout',
        {'next_page': '/account/post-logout'},  name='logout'),
    

    【讨论】:

    • 如果 next_page 值被删除,那么它会重定向到 Django Admin 注销模板,而不是项目中的模板......所以简单地回到原始问题......如果 url 映射到注销视图定义它会产生一个最大递归错误
    • 好吧,你渲染一个模板,但是重定向到一个视图。因此,在您自己的logout(注销后)视图中,您应该渲染模板,而不是尝试重定向到它。然后,将它的 url 添加到urls.py,它与用于实际注销视图的不同。该网址,然后提供为“next_page”。
    【解决方案3】:

    解决问题的办法是把url映射如下

    url(r'^logout/$', 'django.contrib.auth.views.logout', { 'template_name': 'account/logout.html',}, name='logout'),

    【讨论】:

    • @schwobaseggl 非常感谢您的建议让我走上了正确的道路:-)
    猜你喜欢
    • 2021-03-29
    • 2016-12-06
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2011-07-25
    相关资源
    最近更新 更多