Django - get URL from TemplateResponse



我有一个使用内置登录系统的 Django 应用程序。

我正在尝试编写一个单元测试,以验证loginurl 是否重定向到home用户是否已通过身份验证。 这意味着,如果已经过身份验证的用户尝试访问loginURL,他们将被重定向到home

这是 DjangoLoginView的内置功能,我已经验证了它确实在工作。 但是,我不确定如何为此编写单元测试。

问:如何验证此重定向是否通过单元测试发生?LoginView返回一个没有url参数的TemplateResponse

到目前为止,我所拥有的是这样的:

from django.test import TestCase
from django.urls import reverse
home  = reverse('home')
login = reverse('login')
logout = reverse('logout')
signup = reverse('signup')
USER_CREDS = { some users credentials }
class TestLoginView(TestCase):
def test_login_redirect(self):
self.client.post(signup, USER_CREDS)
self.client.get(logout)
self.client.post(login, USER_CREDS)
response = self.client.get(login)
self.assertRedirects(response, home)

编辑:SimpleTestCase.assertRedirects不适用于TemplateResponse对象。

TemplateResponse对象不包含url参数,这是SimpleTestCase.assertRedirect所必需的。

该方法引发以下错误:AttributeError: 'TemplateResponse' object has no attribute 'url'

这与链接的问题不同,因为来自LoginView的响应对象是TemplateResponse,而不是HttpResponse

您可以使用断言重定向检查登录过程是否重定向到所需的命名 URL:

SimpleTestCase.assertRedirects(response, expected_url, status_code=302, target_status_code=200, msg_prefix='', fetch_redirect_response=True)

断言响应返回status_code重定向状态, 重定向到expected_url(包括任何GET数据(,并且 最后一页收到target_status_code。

然后在测试中:

self.assertRedirects(response, home)

编辑

我刚刚遇到了类似的问题,几点说明:

您可以使用跳过身份验证和验证步骤的TestCase.force_login,而不是执行登录过程。

class TestLoginView(TestCase):
def test_login_redirect(self):
self.client.force_login(user)
# logged user retrieves the login page
response = self.client.get(login)
self.assertRedirects(response, home)

响应应该是 302 重定向到home<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/">

如果您在执行response = self.client.get(login)时没有收到重定向,则意味着它正在加载登录页面,这是您不想要的,因此您必须修复该错误。

因此,问题不在于 TemplateResponse 对象不包含 url 参数,而在于您的login页面没有将登录用户重定向到主页。

最新更新