django测试中post json请求需显式设置content_type="application/json",否则默认按表单编码导致400错误;登录态应优先用force_login()跳过csrf和密码验证;重定向测试需设follow=true并检查redirect_chain;外部api应使用requestfactory+patch而非client mock。

能,但必须明确区分“复杂”的类型:是嵌套参数、多格式数据、带认证的跨域请求,还是需要模拟真实响应行为?不同场景解法完全不同,不能一概套用 Client.post()。
POST JSON 请求总返回 400?content_type 必须显式指定
默认情况下,Client.post() 把字典当 application/x-www-form-urlencoded 处理,但现代 API 多数期望 application/json。Django 不会自动转换,也不会报错,只是 request.body 解析为空或出错。
- 正确写法:
self.client.post("/api/v1/users/", {"name": "alice"}, content_type="application/json") - 错误写法:
self.client.post("/api/v1/users/", {"name": "alice"})—— 此时request.POST有数据,json.loads(request.body)却会抛JSONDecodeError - 如果接口还校验
Content-Type头,仅设content_type参数即可,无需额外加HTTP_CONTENT_TYPE
需要登录态但不想走完整登录流程?用 force_login() 而非重复 POST
对 @login_required 或权限控制严格的视图,手动 POST 登录不仅慢,还容易因密码哈希、CSRF、重定向链导致断言复杂化。
-
self.client.force_login(self.user)直接注入认证状态,跳过中间件和表单验证 - 注意:
force_login()不触发user_logged_in信号,若测试逻辑依赖该信号,得手动发信号或改用self.client.login(username=..., password=...) - 若需测试 token 认证(如 JWT),
force_login()无效,应改用HTTP_AUTHORIZATION头:self.client.get("/api/profile/", HTTP_AUTHORIZATION="Bearer abc123")
想测重定向链或中间件副作用?follow=False 是默认陷阱
Client.get() 和 Client.post() 默认 follow=False,意味着重定向不会自动跳转,response 就是 302 响应本身。很多开发者误以为没跳转是代码 bug,其实是测试没配对。
- 要检查最终页面内容,必须传
follow=True:response = self.client.post("/login/", data, follow=True) - 要验证重定向路径是否正确,用
response.redirect_chain—— 它是元组列表,如[('/login/', 302), ('/dashboard/', 302)] -
follow=True会执行全部中间件(包括 SessionMiddleware),但不会执行前端 JS;若需验证 JS 触发的跳转,得换 Selenium
Mock 外部 API 返回结构?别在 Client 层 mock,换 RequestFactory 或 patch
Client 专用于测试你自己的视图,它不拦截 requests.get() 这类外部调用。想测“我的视图调用第三方 API 后怎么处理”,mock 点不在 Client,而在视图内部。
- 推荐组合:
RequestFactory+patch—— 用RequestFactory构造干净请求,再@patch("myapp.views.requests.get")控制返回值 - 避免用
Client测含外部调用的视图,否则每次跑测试都真发请求,慢且不稳定 - 若必须用
Client并 mock,只能 patch 视图函数里实际调用的模块,比如@patch("myapp.views.fetch_user_data"),而不是 patchrequests
真正难的不是发请求,而是判断“这个请求到底该由谁来发”:Client 走全栈,RequestFactory 测纯函数,mock 控制依赖。选错一层,后面所有断言都会偏移。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











