第二次 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 注销不起作用的主要内容,如果未能解决你的问题,请参考以下文章