【问题标题】:Django - get URL from TemplateResponseDjango - 从 TemplateResponse 获取 URL
【发布时间】:2019-02-19 16:15:41
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: python django


【解决方案1】:

您可以使用assertRedirects 检查登录过程是否重定向到所需的命名 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 页面没有将登录用户重定向到主页。

【讨论】:

  • 感谢您的帮助。你确定这行得通吗?它对我不起作用(说 status=200),并且我已经验证了重定向是通过控制台输出发生的(当我手动尝试在浏览器中转到该 url 时)。
  • @user4343502 我确定,我正在使用它。在您发布帖子时捕获响应,而不是获取,这是您的客户登录的地方。
  • 我正在测试登录后访问 url login 是否会重定向我离开 login 页面(我不希望用户访问 login 页面,如果他们'已经通过身份验证)。我认为您是在 登录行为之后引用重定向。
  • @user4343502 更新了答案,看来它毕竟是对的 8)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2021-07-10
  • 2021-05-18
  • 1970-01-01
  • 2021-10-08
  • 2021-03-22
  • 2021-04-12
相关资源
最近更新 更多