第二次Django注销不起作用

时间:2017-03-10 06:49:15

标签: django django-views

我正在尝试让我的Django登录/注销正常工作,但在我登录并注销一次后出现问题。如果我再次以同一用户或其他用户身份登录,我将无法再次注销。我很好奇,如果有人之前曾经历过这个,因为我目前无法弄清楚发生了什么,我已经尝试了contrib.auth.logout以及我自己的注销视图(请求)。

谢谢

- 编辑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作为Logout按钮的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提供的登录和注销视图以及我目前拥有的视图。

1 个答案:

答案 0 :(得分:2)

return redirect('login_view', permanent = True)

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

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

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