【问题标题】:Why is user.is_authenticated asserting true after logout为什么 user.is_authenticated 在注销后断言为真
【发布时间】:2020-10-18 13:39:39
【问题描述】:

我正在尝试编写一个用于在 Django 中注销用户的测试。代码如下:

urls.py

from django.conf.urls import url
from django.contrib import admin
from accounts.views import LoginView, LogoutView


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', LoginView.as_view(), name='login'),
    url(r'^logout/', LogoutView.as_view(), name='logout'),
]

views.py

from django.http import HttpResponseRedirect
from django.contrib.auth import login, logout
from django.views.generic import View


class LogoutView(View):
    def get(self, request):
        logout(request)
        return HttpResponseRedirect('/')

tests.py

from django.test import TestCase, Client
from django.contrib.auth.models import User


class LogoutTest(TestCase):
    def setUp(self):
        self.client = Client()
        self.user = User.objects.create_user(
            username='user1',
            email='user1_123@gmail.com',
            password='top_secret123'
        )

    def test_user_logs_out(self):
        self.client.login(email=self.user.email, password=self.user.password)
        self.assertTrue(self.user.is_authenticated)

        response = self.client.get('/logout/')

        self.assertFalse(self.user.is_authenticated)
        self.assertRedirects(response, '/', 302)

断言self.assertFalse(self.user.is_authenticated) 失败。通过浏览器进行测试似乎工作正常。似乎在调用logout() 后用户将无法通过身份验证。我错过了什么吗?

【问题讨论】:

    标签: python django django-authentication


    【解决方案1】:

    似乎用户在调用logout() 后不会通过身份验证。我错过了什么吗?

    .is_authenticated [Django-doc]检查用户是否登录。每个真正的User 都返回总是Trueis_authenticated。例如,AnonymousUser [Django-doc] 将返回 False。如果您因此注销,则request.user 将成为AnonymousUser,因此不会被验证。

    换句话说,如果您使用request.user.is_authenticated,如果会话绑定到用户(您使用浏览器登录),您将在登录用户上调用它,并且您在AnonymousUser上调用它如果浏览器未登录用户/浏览器已注销。

    【讨论】:

    • 我一直在努力解决这个问题,因为我没有意识到 request.userUnion[AbstractBaseUser, AnonymousUser],用“类型切换”技术来解决这个问题很奇怪,但我相信它会产生一些大局观。
    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 2018-05-10
    • 1970-01-01
    • 2019-12-05
    • 2015-01-04
    • 2022-11-21
    • 2010-11-08
    • 2014-08-26
    相关资源
    最近更新 更多