当对 localhost:121/logout 执行 GET 请求时,我得到 "accounts.views.logout didn't return an HttpResponse object"。这是一个问题吗?

When doing GET request to localhost:121/logout I get "accounts.views.logout didn't return an HttpResponse object". Is this an issue?

当我转到 localhost:121/logout 时,我得到 The view accounts.views.logout didn't return an HttpResponse object。它 return 改为 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>

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

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

这实际上取决于您希望应用程序执行的操作。当您导航到 /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