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
相关产品推荐
相关产品推荐

