第二次 Django 注销不起作用

Posted

技术标签:

【中文标题】第二次 Django 注销不起作用【英文标题】:Second Django Logout Does Not Work 【发布时间】:2017-07-31 10:09:16 【问题描述】:

我目前正在尝试让我的 Django 登录/注销正常工作,但是在我登录并注销一次后遇到了问题。如果我以相同用户或不同用户的身份再次登录,我将无法再次注销。我很好奇是否有人曾经经历过这种情况,因为我目前无法弄清楚发生了什么,并且我尝试了 contrib.auth.logout 以及我自己的调用 logout(request) 的注销视图。

谢谢

-- 编辑 1--

我开始认为这可能是一个缓存问题,但我非常怀疑。

my_app/urls.py:

from django.conf.urls import url
from django.contrib.auth import views as auth_views

from . import views

urlpatterns = [
    url(r'^$', views.index, name = 'index'),
    #url(r'^login/$', auth_views.login, name = 'login'),
    #url(r'^logout/$', auth_views.logout, name = 'logout'),
    url(r'^login/$', views.login_view, name = 'login_view'),
    url(r'^logout/$', views.logout_view, name = 'logout_view'),
    ...
]

my_app/views.py:

...

def index(request):  # Main login page
    if request.user.is_authenticated:
       user = request.user
       gen_prof = General_Profile.objects.get(user_id = user.id)
       return redirect('home_page', permanent = True)

    return redirect('login_view', permanent = True)


def login_view(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            cleaned = form.cleaned_data
            username = cleaned['username']
            password = cleaned['password']
            user = authenticate(username = username, password = password)
            if user is not None:
                login(request, user)
                gen_prof = General_Profile.objects.get(user_id = user.id)
                # Redirect to a success page.
                return redirect('home_page', permanent = True)
            #else:
                # return HttpResponse("user is None")
                # Return an 'invalid login' error message.
    else:
        form = LoginForm()

    template = loader.get_template('cloud/login.html')
    context = 'form': form

    return HttpResponse(template.render(context, request))


def logout_view(request):
    logout(request)

    return redirect('login_view', permanent = True)

...

在模板中,我使用 logout_view 作为注销按钮的 url。

-- 编辑 2--

我的 urls.py 现在是这样的:

urlpatterns = [
    url(r'^$', views.index, name = 'index'),
    url(r'^accounts/login/$', auth_views.login),
    url(r'^login/$', auth_views.login, name = 'login_view'),
    url(r'^logout/$', auth_views.logout, name = 'logout_view'),
    #url(r'^login/$', views.login_view, name = 'login_view'),
    #url(r'^logout/$', views.logout_view, name = 'logout_view'),
    ...
]

我还在为我的函数使用@login_required 装饰器。我想我想弄清楚的是如何实现 Django 提供的登录和注销视图以及我目前拥有的视图。

【问题讨论】:

显示一些代码,例如logout查看 刚刚编辑过@Bijoy 【参考方案1】:
return redirect('login_view', permanent = True)

您在登录和注销视图中使用了永久重定向。这意味着您的浏览器会直接进入目标页面,因此服务器不会让用户登录或注销。

即使您删除了permanent = True,您的浏览器也可能会存储永久重定向。您可以使用其他浏览器测试您的代码是否有效。

Django 带有登录和注销视图。我建议您使用它们来避免这个错误或其他错误。

【讨论】:

感谢您的帮助!我试过了,但在弄清楚如何使用 Django 登录和注销视图时遇到了一些麻烦。请参阅上面的编辑 2,了解我在您发表评论后所做的更改

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

注销页面在 Django 中不起作用

注销在 Django 中不起作用

下拉菜单不起作用 Django

带有 KeycloakOpenID 的 python-keycloak 包:注销不起作用

第二次通知不起作用

第二次单击时的 jQuery 不起作用 - 移动设备