繁体   English   中英

Django 测试重定向以使用下一个参数登录

[英]Django Test Redirect to login with next parameter

我正在尝试测试非登录用户重定向到登录 url。 有没有办法将get参数(例如'next')传递给reverse_lazy? 我正在使用基于类的视图。

class SecretIndexViewTest(TestCase):
    url = reverse_lazy('secret_index')
    login_url = reverse_lazy('login')
    client = Client()

    def test_http_status_code_302(self):
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 302)
        self.assertRedirects(response, self.login_url,)

以上失败

Response redirected to '/login?next=/secret', expected '/login'Expected '/login?next=/secret' to equal '/login'.

试过了

class SecretIndexViewTest(TestCase):
    url = reverse_lazy('secret_index')
    login_url = reverse_lazy('login', kwargs={'next': url)
    client = Client()

    def test_http_status_code_302(self):
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 302)
        self.assertRedirects(response, self.login_url,)

结果没有反向匹配

django.urls.exceptions.NoReverseMatch: Reverse for 'login' with keyword arguments '{'next': '/secret'}' not found. 1 pattern(s) tried: ['/login$']

将 kwargs 更改为 args 将导致相同的错误。

我知道我可以在下面处理它,但我正在寻找更好的解决方案。

self.assertRedirects(response, self.login_url + f"?next={self.url}",)

或者

login_url = reverse_lazy('login') + f"?next={url}"

Django 文档中所述reverse (和reverse_lazy )不包含 GET 参数,因此您的字符串格式化示例是最简单的解决方案之一。

URLconf 搜索请求的 URL,作为正常的 Python 字符串。 这不包括 GET 或 POST 参数或域名。

例如,在对https://www.example.com/myapp/的请求中,URLconf 将查找 myapp/。

在对https://www.example.com/myapp/?page=3的请求中,URLconf 将查找 myapp/。

URLconf 不查看请求方法。 换句话说,所有请求方法——POST、GET、HEAD 等——都将被路由到相同的 function 以获得相同的 URL。

如果您担心对查询字符串进行编码,可以使用urllib.parse模块中的工具(例如urllib.parse.urlencode )对查询进行编码,然后通过连接reverse路径和编码查询参数来构建完整的 URL。

对于简单的情况,例如您确切知道传入了什么数据的测试,我倾向于坚持使用简单的字符串格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM