我正在尝试为django创建一个注销页面。
这是views.py文件:
def index(request):
if not request.user.is_authenticated():
return redirect('webapp/login.html')
else:
result = Hello_World.delay()
somethingDownByCelery = result.get(timeout=2)
context = {'somethingDownByCelery': somethingDownByCelery, 'userName': request.user.username}
return render(request, 'webapp/index.html', context)
def loginUser(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
return redirect('webapp/index.html')
else:
return redirect('webapp/disabled.html')
else:
condition = "Invalid Login"
context = {'condition', condition}
return render(request, 'webapp/index.html', context)
def logoutUser(request):
logout(request)
return redirect('webapp/index.html')
这是启动注销后的索引页面。
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'WebApp/style.css' %}"/>
Hello World, this will call celery!
<html>
<br>
</html>
{{ somethingDownByCelery }}
<html>
<br>
<br>
</html>
Hello! {{ userName }}
<html>
<br>
<br>
</html>
<form action="{% url 'WebApp:logout'%}" method="post">
{% csrf_token %}
<p> Logout </p>
<input type="submit" value="Submit">
</form>
应该发生的是用户注销,并被重定向到索引页面,而由于用户没有登录,它会将用户重定向到登录页面。
但是,它只显示我:视图django.contrib.auth.logout没有返回HttpResponse对象。
这是项目根urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
from WebApp import views
from StripCal import views
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'Dashboard_Web.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^webapp/', include('WebApp.urls', namespace="WebApp")),
)
这是应用的urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
from WebApp import views
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^login', views.login, name='login'),
url(r'^logout', views.logout, name='logout'),
)
答案 0 :(得分:3)
试试这个:
from django.shortcuts import HttpResponseRedirect
def logoutUser(request):
logout(request)
return HttpResponseRedirect('/loginpage/')
而不是webapp/index.html
,您应该在/loginpage/
HttpResponseRedirect
答案 1 :(得分:3)
不要自己编写,而是使用Djangos内置注销视图。
#urls.py
from django.contrib.auth.views import logout
url(r'^sign-out/$', logout, {'template_name': 'index.html', 'next_page': '/'}, name='sign-out'),
Docs are found here现在你可以在不使用表单的情况下链接到这个,Django会为你做重定向。
答案 2 :(得分:1)
我知道这是一篇过时的文章,但是没有答案可以解决代码中出了什么问题,所以就在这里。
在webapp urls.py
中,文件视图必须指向logoutUser视图而不是注销视图。
并与登录视图类似
from django.contrib import admin
from WebApp import views
urlpatterns = patterns('',
url(r'^$', views.index, name='index'),
url(r'^login', views.loginUser, name='login'),
url(r'^logout', views.logoutUser, name='logout'),
)
现在url函数将预期的view方法作为参数
答案 3 :(得分:0)
第一件事。 您的函数应类似于此函数:
def logout_view(request):
logout(request)
return redirect('/login')
要使用注销,您必须像这样导入注销:
from django.contrib.auth import logout
如果要基于User.is_authenticated重定向用户,它将永远不会重定向,因为如果用户未登录,则会创建一个匿名用户。 您可以执行以下操作:
def home(request):
if request.user.is_anonymous == True:
return redirect('/login')
else:
return render(request,"index.html",{'nav':request.user})