如何解决Django 测试重定向以使用下一个参数登录
我正在尝试测试非登录用户重定向到登录 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,)
结果没有反向匹配
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}"
解决方法
由于 mentioned in the Django documentation、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 等——都将被路由到相同 URL 的相同函数。
如果您担心对查询字符串进行编码,可以使用 urllib.parse
module 中的工具(例如 urllib.parse.urlencode
)通过连接来自 {{1} 的路径在构建完整 URL 之前对查询进行编码} 和编码的查询参数。
对于简单的情况,例如您确切知道传入哪些数据的测试,我倾向于坚持使用简单的字符串格式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。