0
votes

I realize that this question has been asked before, but I'm struggling for explanation as to why I'm getting the following error:

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

I'm following exactly what Django has in their docs here when it comes to logging out:

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                                                                             
1
Please add the complete error tracebackJPG
@JPG ... traceback addedbinny
What is uv here? Can you add the complete import statement ?JPG
uv is an import alias for the views in the users app that is contained in the main urls module. from users import views as uvbinny
Not sure if it's in your actual code, but there's a typo here: logout(reqeust). The e and u are flipped.elyas

1 Answers

2
votes

You are pointing your /users/logout/ to the logout(...) function, which is not a view class/function. So, do this

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