当对 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 不会捕获被调用方法的内部异常[重复]