Pad*_*eye 3 python django templates
有以下问题;我正在通过示例关注 Django,Antonio Mele。这里的练习是设置用户登录和注销。使用默认的 contrib.auth 视图。当使用书中的代码时。注销视图是管理页面注销的视图;似乎与此处描述的问题相同
django 注销将我重定向到管理页面。试过了都没有成功
我一直在研究这个问题。我的代码现在可以工作,因为不再呈现管理模板。但是,我仍然无法使用我自己的 logout.html。我可以重定向到我自己的 login.html...但不是 logout.html。注销本身正在工作。用户可以使用模板登录和退出仅此问题。我现在只收到一个浏览器错误
页面没有正确重定向 Iceweasel 检测到 > 服务器正在以一种永远不会完成的方式重定向对该地址的请求。这个问题有时可能是由禁用或 > 拒绝接受 cookie 引起的。
检查 cookie 可以看到 csrf 令牌被接受
没有可用的回溯没有错误:-(
如果我使用下面的代码,所有工作都有一个例外。我在注销时被重定向到 Django 管理注销模板,而不是我自己的 logout.html....这是在书中使用 coede 时....我自己修改的代码,带有单独的注销功能也无法生成最大递归错误。编辑 URLS.PY 会停止呈现管理模板。但修改后的代码似乎在 url 中有问题,即 .....
这是行不通的!!!!!
url(r'^logout/$', 'django.contrib.auth.views.logout',{'next_page': '/account/logout'}, name='logout'),
Run Code Online (Sandbox Code Playgroud)
这工作完美!
url(r'^logout/$', 'django.contrib.auth.views.logout',{'next_page': '/account/login'}, name='logout'),
Run Code Online (Sandbox Code Playgroud)
书中的代码如下
从书籍设置.PY
from django.core.urlresolvers import reverse_lazy
LOGIN_REDIRECT_URL = reverse_lazy('dashboard')
LOGIN_URL = reverse_lazy('login')
LOGOUT_URL = reverse_lazy('logout')
Run Code Online (Sandbox Code Playgroud)
从书 VIEWS.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})
Run Code Online (Sandbox Code Playgroud)
从书主 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')),
]
Run Code Online (Sandbox Code Playgroud)
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'),
Run Code Online (Sandbox Code Playgroud)
我修改后的代码
我现在在我的视图中包含了一个单独的注销定义,现在还传递了一个 {key:value} 对 {'next_page': '/account/logout'}。
如果 logout def 被使用并映射到 urls 文件中,它会在 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))
Run Code Online (Sandbox Code Playgroud)
没有这个定义,产生的唯一错误是
""" 页面没有正确重定向
"""Iceweasel 检测到服务器正在以永远不会完成的方式重定向对该地址的请求。
This problem can sometimes be caused by disabling or refusing to accept cookies.""""
Run Code Online (Sandbox Code Playgroud)
""" 我在浏览器中检查了 cookie,看到 csrf_token 被接受
对我来说奇怪的是,如果代码:{'next_page': '/account/logout'} 更改为 {'next_page': '/account/login'} 一切正常。已经尝试了所有找到的建议,我很茫然,感谢任何帮助......
我的代码视图.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))
Run Code Online (Sandbox Code Playgroud)
我的代码帐户/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'),
]
Run Code Online (Sandbox Code Playgroud)
我的代码主 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")),
]
Run Code Online (Sandbox Code Playgroud)
MYCODE 设置.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' ),
# )
Run Code Online (Sandbox Code Playgroud)
MYCODE
登出.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 %}
Run Code Online (Sandbox Code Playgroud)
MYCODE 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>
Run Code Online (Sandbox Code Playgroud)
小智 6
我遇到了同样的问题,但后来我继续阅读
“如果您看到的是 Django 管理站点的注销页面而不是您自己的注销页面,请检查项目的 INSTALLED_APPS 设置并确保 django.contrib.admin 出现在帐户申请之后。两个模板都位于相同的相对路径,Django 模板加载器将使用它找到的第一个。”
您正在使用contrib.auth的logout在您的视图urls.py。此视图重定向到由 指定的 URL 'next_page'。您提供'/account/logout'为next_page- 再次logout调用视图的地方!
这会导致(无限)重定向循环:视图重定向到自身。
尝试改为:在您自己的logout观点中:
# no redirecting here!
return render(request, 'account/logout.html',
context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
在 中为该视图添加一个 url account/urls.py:
url(r'^post-logout/$', logout, name='post-logout'),
# logout being your own view
Run Code Online (Sandbox Code Playgroud)
然后提供'next_page'有关实际 ( auth) 注销的url :
url(r'^logout/$', 'django.contrib.auth.views.logout',
{'next_page': '/account/post-logout'}, name='logout'),
Run Code Online (Sandbox Code Playgroud)