【问题标题】:ValueError: logout didn't return an HttpResponse object. It returned None insteadValueError:注销未返回 HttpResponse 对象。它返回 None 而不是
【发布时间】:2021-04-22 02:24:32
【问题描述】:

我知道这个问题以前曾被问过,但我正在努力解释为什么我会收到以下错误:

  • ValueError: The view django.contrib.auth.logout didn't return an HttpResponse object. It returned None instead.

在注销时,我完全按照 Django 在他们的文档中的内容:

https://docs.djangoproject.com/en/3.2/topics/auth/default/#how-to-log-a-user-out

from django.views.generic.base import TemplateView
from django.contrib.auth.models import User
from django.contrib.auth import login, logout
from django.urls import reverse
from django.contrib import messages
from .forms import RegisterUserForm, LoginUserForm

from .codes import HttpResponseSeeOther

class RegisterPage(TemplateView):

    template_name = "users/register_user.html"

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['register_form'] = RegisterUserForm(self.request.POST or None)
        return context

    def get(self, request):
        context = self.get_context_data()
        return self.render_to_response(context)

    def post(self, request):
        context = self.get_context_data()
        if context['register_form'].is_valid():
            context['register_form'].save()
            messages.success(request, "You're registered! Please login!")
            return HttpResponseSeeOther(reverse("users:login"))
        return self.render_to_response(context)

class LoginPage(TemplateView):

    template_name = "users/login_page.html"

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['login_form'] = LoginUserForm(data=self.request.POST or None)
        return context

    def get(self, request):
        context = self.get_context_data()
        return self.render_to_response(context)

    def post(self, request):
        context = self.get_context_data()
        form = context['login_form']
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            return HttpResponseSeeOther(reverse("questions:mainpage"))
        return self.render_to_response(context)


def logout_user(request):
    logout(reqeust)
    return HttpResponseSeeOther(reverse("users:login"))

from users import views as uv

user_urls = ([
    path("register/", uv.RegisterPage.as_view(), name="register"),
    path("login/", uv.LoginPage.as_view(), name="login"),
    path("logout/", uv.logout, name="logout")
], 'users')

urlpatterns = [
    path('admin/', admin.site.urls),
    path("", include(question_urls)),
    path("users/", include(user_urls)),
]
[21/Apr/2021 19:35:18] "GET / HTTP/1.1" 302 0                                                                                              
[21/Apr/2021 19:35:18] "GET /users/login/?next=/ HTTP/1.1" 200 1319                                                                        
[21/Apr/2021 19:35:25] "POST /users/login/ HTTP/1.1" 303 0                                                                                 
[21/Apr/2021 19:35:25] "GET / HTTP/1.1" 200 1745                                                                                           
Internal Server Error: /users/logout/                                                                                                      
Traceback (most recent call last):                                                                                                         
  File "C:\Users\...\django\core\handlers\exception.py", line 34, in inner      
    response = get_response(request)                                                                                                       
  File "C:\Users\...\django\core\handlers\base.py", line 126, in _get_response  
    "returned None instead." % (callback.__module__, view_name)                                                                            
ValueError: The view django.contrib.auth.logout didn't return an HttpResponse object. It returned None instead.                            
[21/Apr/2021 19:35:27] "GET /users/logout/ HTTP/1.1" 500 74852                                                                             

【问题讨论】:

  • 请添加完整的错误回溯
  • @JPG ... 添加了回溯
  • 这里的uv 是什么?你能添加完整的导入语句吗?
  • uv 是主 urls 模块中包含的 users 应用程序中视图的导入别名。 from users import views as uv
  • 不确定它是否在您的实际代码中,但这里有一个错字:logout(reqeust)eu 被翻转。

标签: python django


【解决方案1】:

您将/users/logout/ 指向logout(...) 函数,该函数不是视图类/函数。所以,这样做

path("logout/", <b>uv.logout_user</b>, name="logout")

【讨论】:

    猜你喜欢
    • 2020-11-01
    • 2019-06-12
    • 2018-06-02
    • 2020-08-19
    • 2019-06-12
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多