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

Django测试Client.put请求无法获取数据问题排查

解决Django REST Framework中PUT请求无法获取数据的问题

我清楚你遇到的困扰——用Django Test Client发送PUT请求后,在视图的update方法里通过request.POST.get拿不到传入的数据,这其实是Django原生与DRF对请求数据处理逻辑的差异导致的,下面给你一步步梳理解决方案:

问题根源

Django原生的request.POST只负责解析表单编码的POST请求数据,PUT请求的请求体内容并不会被存入POST属性中。而Django REST Framework提供了request.data属性,它能统一处理所有HTTP方法(GET/POST/PUT/PATCH等)的请求体数据,不管是表单编码还是JSON格式都能正确解析。

解决方案步骤

1. 修改视图中的数据获取方式

把视图里的request.POST.get替换为request.data.get,这是DRF推荐的统一数据获取方式:

def update(self, request, pk=None):
    user = request.mobile_user
    ...
    # 替换原来的request.POST.get
    family_id = request.data.get('family_id', None)
    ...

2. 调整测试代码的PUT请求发送方式

用Django Test Client发送PUT请求时,需要确保数据以正确格式传递。RESTful API通常推荐使用JSON格式,修改你的测试代码如下:

import json
from django.test import Client

client = Client()
data = {
    'join_type': 'join',
    'family_id': target_family.id,
}
headers = {
    'Authorization': user.api_key,
    # 按需添加其他请求头
}

# 发送PUT请求,指定content_type为application/json,数据转成JSON字符串
response = client.put(
    '/your/move/endpoint/{pk}/'.format(pk=your_target_pk),  # 替换为你的实际接口URL
    data=json.dumps(data),
    content_type='application/json',
    **headers
)

如果你的API确实需要接收表单编码的PUT请求(不推荐RESTful API使用这种方式),也可以这样传数据,但视图仍需使用request.data获取:

response = client.put(
    '/your/move/endpoint/{pk}/',
    data=data,
    content_type='application/x-www-form-urlencoded',
    **headers
)

额外优化提示

如果你的测试经常涉及DRF接口,建议使用DRF自带的APIClient,它对RESTful请求的支持更友好,无需手动转换JSON格式:

from rest_framework.test import APIClient

client = APIClient()
client.credentials(HTTP_AUTHORIZATION=user.api_key)
response = client.put('/your/move/endpoint/{pk}/', data=data)

完成以上修改后,你就能在视图的update方法里正确获取到PUT请求传入的数据了。

内容的提问来源于stack exchange,提问作者Hyunseo Yang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:05:53