当对 localhost:121/logout 进行 GET 请求时,我得到“accounts.views.logout 没有返回 HttpResponse 对象”。这是一个问题吗?

Posted

技术标签:

【中文标题】当对 localhost:121/logout 进行 GET 请求时,我得到“accounts.views.logout 没有返回 HttpResponse 对象”。这是一个问题吗?【英文标题】:When doing GET request to localhost:121/logout I get "accounts.views.logout didn't return an HttpResponse object". Is this an issue? 【发布时间】:2020-01-29 05:17:53 【问题描述】:

当我转到 localhost:121/logout 时,我得到视图 accounts.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>

【问题讨论】:

【参考方案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)

【讨论】:

如果我将 GET 和 POST 放在一起,是否有必要将 POST 请求作为我的 profile.html 的一部分,或者我应该将其切换为 GET 注销 如果它是表单的一部分,或者您想使用 AJAX,那么您可能有理由使用 POST,但我看不出有任何理由必须使用 POST 执行此操作,并且您建议的链接应该可以正常工作。【参考方案2】:

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

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

【讨论】:

以上是关于当对 localhost:121/logout 进行 GET 请求时,我得到“accounts.views.logout 没有返回 HttpResponse 对象”。这是一个问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

当对集合的引用未更改时,我应该返回集合吗?

当对 $.ajax 的响应为 301 时,我可以通过编程方式获取新 URL 吗?

当对 COUNT 聚合的值执行 ORDER BY 时,发出查询需要时间

当对异步任务使用丢弃(_)时,try catch 不会捕获被调用方法的内部异常[重复]

当对集合进行 get 调用时,Hibernate 会删除延迟加载的多对多集合

当对基于声明的模型使用多值插入时,不会为每一行单独调用 Python 端默认值