Python客户端调用Django注册接口报错{'user': ['This field is required.']}
问题解决:Python客户端POST请求DRF嵌套序列化器提示字段必填
问题原因
你用requests.post的data参数发送请求时,数据会被编码为表单格式(application/x-www-form-urlencoded),这种格式无法正确传递嵌套字典结构(比如你传入的user子字典)。DRF的序列化器解析时,会把嵌套的user字典当成普通字符串处理,导致无法识别user字段,因此返回"This field is required"错误。而DRF的可浏览API默认发送的是JSON格式请求,所以能正常工作。
解决方案
只需要把请求数据以JSON格式发送即可,有两种实现方式:
方式1:使用requests.post的json参数(推荐)
requests会自动把字典序列化为JSON字符串,并设置正确的Content-Type请求头:
import requests data = { "user": { "username": "a", "email": "test@gmail.com", "first_name": "test", "last_name": "test", "password": "a" }, "photo_url": "", "bio": "" } endpoint = 'http://localhost:8000/api/reader/register/' response = requests.post(endpoint, json=data) # 改用json参数
方式2:手动序列化JSON并设置请求头
如果需要更手动控制,可以自己把字典转成JSON字符串,同时指定Content-Type为application/json:
import requests import json data = { "user": { "username": "a", "email": "test@gmail.com", "first_name": "test", "last_name": "test", "password": "a" }, "photo_url": "", "bio": "" } endpoint = 'http://localhost:8000/api/reader/register/' headers = {"Content-Type": "application/json"} response = requests.post(endpoint, data=json.dumps(data), headers=headers)
额外验证
发送请求后,可以打印response.json()查看结果,确认是否注册成功。如果还有其他错误(比如用户名重复、邮箱格式问题),可以根据返回的提示调整数据。
内容的提问来源于stack exchange,提问作者Asif Azad
相关产品推荐
相关产品推荐

