使用requests向Django Rest Framework上传数据及图片报错求助
问题解决:DRF API上传图片报错TypeError
错误原因
- 使用
json.dumps(data)序列化包含文件对象的请求数据,JSON无法序列化BufferedReader类型(即open('chat2.png','rb')返回的文件流) - 手动设置
Content-Type: multipart/form-data,但requests处理文件上传时会自动生成包含boundary的正确请求头,手动设置会破坏请求格式
修正后的PyQt请求代码
class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__() url = 'http://127.0.0.1:8000/api/upload/' # 无需手动设置Content-Type,requests会自动处理 data = { 'name':'data', 'price':'123', 'category':1 } # 用files参数单独传递图片文件,DRF可自动解析 with open('chat2.png','rb') as img_file: files = { 'image': ('chat2.png', img_file, 'image/png') } # 直接传入data和files,不要用json.dumps序列化 r = requests.post(url, data=data, files=files)
补充说明
- 你的
MenuSerializer和MenuViewset无需修改,DRF的ModelSerializer默认支持ImageField的文件上传,ListCreateAPIView已包含POST请求处理逻辑 - 使用
with语句打开文件可自动关闭流,避免资源泄漏
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

