注销页面在 Django 中不起作用

Posted

技术标签:

【中文标题】注销页面在 Django 中不起作用【英文标题】:Logout Page not working in Django 【发布时间】:2014-10-06 02:25:38 【问题描述】:

我正在尝试为 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'),
)

【问题讨论】:

你为什么不这样做:return HttpResponseRedirect('webapp/index.html') 而不是 return redirect('webapp/index.html') 另外你为什么要登出?即使使用GET,您也会收到请求。 因为如果有人预取,结果会很有趣 您实际上并没有进入 logoutUser 视图,正如错误消息所证明的那样:不知何故,您将进入 django.contrib.auth.logout,这不是一个视图。你能发布你的 urls.py 吗? 【参考方案1】:

试试这个:

from django.shortcuts import HttpResponseRedirect

def logoutUser(request):
   logout(request)
   return HttpResponseRedirect('/loginpage/')

除了webapp/index.html,您应该在HttpResponseRedirect 中提供您的登录页面的URL,例如/loginpage/

【讨论】:

不幸的是,HttpResponseRedirect 也不起作用。我不确定为什么会这样。 @user1157751 查看我的更新。您应该提供登录页面的 URL。 感谢您的帮助!但是,我做的 HttpReponseRedict('/login.html') 也不起作用。 @user1157751 这是因为你有url(r'^login', views.login, name='login') 而不是url(r'^login.html', views.login, name='login')【参考方案2】:

不要自己编写,而是使用 Django 内置的注销视图。

#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 会为您处理重定向。

【讨论】:

感谢您的帮助!我宁愿以“原始”方式来做,因为我是 Django 视图的新手。 是的,不用担心,但是当它提供给你并且你可以把时间更好地用于其他相关的东西时,为什么要在简单的东西上重新发明***:) 我实际上已经尝试过使用这个网址,而且效果很好,但它似乎是黑魔法 D: 嘿,这是框架。它为您提供所需的工具。为了让它看起来不那么黑魔法,这里是来源github.com/django/django/blob/master/django/contrib/auth/… 感谢源文件!【参考方案3】:

我知道这是一篇旧帖子,但没有答案解决代码中的问题,所以在这里。 在 webapp urls.py 文件视图中必须指向 logoutUser 视图而不是 logout 视图。 与登录视图类似

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 函数将预期的视图方法作为参数

【讨论】:

【参考方案4】:

首先要做的事情。 你的函数应该和这个类似:

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)

【讨论】:

以上是关于注销页面在 Django 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Instagram注销在iPhone中不起作用?

Facebook 注销在新 SDK 中不起作用

网址在 Django 中不起作用

Firebase 注销在颤振应用程序中不起作用

单次注销在 keycloak 和 spring security 中不起作用

clearInterval 在 componentWillUnmount 中不起作用