django-allauth 测试请求作为经过身份验证的用户

django-allauth test request as authenticated user

我有一个新的 Django 项目(2.2 版)、一个自定义用户模型和 django-allauth 来管理用户注册(不是通过社交,只是通过电子邮件确认),我正在尝试测试一些受保护的观看次数。

在测试的 setUp 方法中,我创建了一个新用户并使用 verifiedprimary 创建了一个新的 EmailAddress(来自 allauth.account.models)设置为 True.

接下来我尝试登录:self.client.login(username=username, password=password) 我得到 True 所以到目前为止一切正常并且用户已登录。

如果我尝试查看任何需要登录的内容,我会收到 301 重定向到登录页面。

这是我的代码:

在设置中创建用户

username = 'test@test.com'
password = 'testtesttest'

new_user = User.objects.create_user(
    username=username,
    email=username,
    password=password,
    )
new_user.save()
new_user.is_active = True
new_user.save()

new_email_address = EmailAddress(
    user_id=new_user.id,
    email=username,
    verified=True,
    primary=True,
    )
new_email_address.save()

登录并测试登录

logged_in = self.client.login(email=username, password=password)
self.assertTrue(logged_in)  # and this works as expected

现在,如果我尝试请求需要登录的视图:

response = self.client.get("/protected")

我得到<HttpResponsePermanentRedirect status_code=301, "text/html; charset=utf-8", url="/protected/">

我错过了什么或做错了什么?

您显示的重定向实际上向您显示了 url 它重定向到:url="/protected/"。所以您不会被重定向到登录页面。

请注意,正常的重定向是 302 重定向(临时),而在这里您看到的是永久重定向 301。

请求正确的 url (self.client.get('/protected/')) 或遵循重定向:self.client.get('/protected', follow=True)。这样您的回复将针对最后一页,您可以测试其内容是否符合您的预期。