You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用pytest-django跟随Django重定向完成ArchiveIndexView测试?

解决pytest-django中跟随Django重定向的问题

这个问题其实很常见,本质上是利用Django测试客户端的内置能力来处理重定向——pytest-django只是封装了Django的测试工具,所以直接用Django客户端的参数就行,文档没提是因为这属于Django本身的测试功能~

1. 基础解决方法:在请求中添加follow=True

你的测试失败是因为请求触发了301永久重定向,而默认情况下client.get()不会自动跟随重定向,返回的是重定向响应而非最终的页面响应。只需要在调用get方法时加上follow=True参数,客户端就会自动跟随所有重定向,返回最终到达页面的响应:

def test_archive_view(client):
    # 添加follow=True,自动跟随重定向
    response = client.get('/checklist_GTD/archive/', follow=True)
    # 现在断言最终页面的状态码为200
    assert response.status_code == 200

2. 验证重定向过程(可选)

如果你需要确认重定向的具体路径和状态码,可以通过response.redirect_chain属性查看所有重定向步骤。这个属性是一个列表,每个元素是一个元组(重定向目标URL, 状态码):

def test_archive_redirect(client):
    response = client.get('/checklist_GTD/archive', follow=True)  # 故意不带斜杠触发重定向
    # 验证重定向链是否符合预期
    assert response.redirect_chain == [('/checklist_GTD/archive/', 301)]
    # 同时验证最终页面状态码
    assert response.status_code == 200

3. 为什么会出现这个301?

顺便提一句,你遇到的301大概率是Django的APPEND_SLASH设置(默认开启)导致的:如果你的URLconf中配置的路径是带末尾斜杠的checklist_GTD/archive/,但请求时没加斜杠,Django会自动重定向到带斜杠的版本并返回301。用follow=True可以忽略这个细节,直接拿到最终页面的响应。

内容的提问来源于stack exchange,提问作者Scott Skiles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:25:03