[向本地主机:121 / logout执行GET请求时,我得到“ accounts.views.logout没有返回HttpResponse对象”。这是问题吗?

问题描述 投票:0回答:2

[当我进入localhost:121 / logout时,我得到了视图account.views.logout没有返回HttpResponse对象。它返回None。

我应该修改我的代码以处理此问题,还是这不是问题?我的注销工作正常。我是否必须在urls.py中列出注销信息?

views.py

def logout(request):
    if request.method == "POST":
        auth.logout(request)
        return redirect('login')

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('register/', views.register, name='register'),
    path('logout', views.logout, name='logout'),
    path('', views.login, name='login'),
]

profile.html

<ul>
<li>
<a class="dropdown-item" href="javascript:{document.getElementById('logout').submit()}">Logout</a>
 </li>
 <form id="logout" action="{% url 'logout' %}" method="POST">
 {% csrf_token %}
 <input type="hidden">
</form>
</ul>
django django-models django-views django-urls django-authentication
2个回答
1
投票

这实际上取决于您希望应用程序执行的操作。导航到/logout时会发生什么?如果您想仅通过导航来为用户提供注销的方法,则可以将GET和POST请求一起处理。 (如@Beste所建议),例如:

def logout(request):
    auth.logout(request)
    return redirect('login')

这具有额外的优势,您只需使用指向此URL的超链接就可以从网站上的任何地方注销。

如果您不希望发生这种情况,我建议您提出405(不允许的方法),例如:

from django.http import HttpResponse

def logout(request):
    if request.method == "POST":
        auth.logout(request)
        return redirect('login')
    return HttpResponse(status_code=405)

而且是的,无论您做什么,都需要在urls.py中列出该位置。或者甚至可以使用HttpResponseNotAllowed(请参阅here


3
投票

GET和POST请求可以重定向到登录页面。注销方法也适用于注销用户。

def logout(request):
    auth.logout(request)
    return redirect('login')
© www.soinside.com 2019 - 2024. All rights reserved.