当我提交一个POST请求时,Content-Type
为application/json
,我在服务器上的数据被解码成本机Python,JSON对象以dict的形式呈现,数组以数组的形式呈现,这太棒了。
但是,当我对我的API执行多部分post请求时,当然它也包含一个文件,任何包含JSON/objects的字段都不会在服务器上解码,我只剩下需要自己解码的字符串。我的应用程序的性质意味着我不能总是知道我将要获得哪些领域。在
我的问题是-如何提交一个包含文件的多部分请求,同时保留DRF在某些字段中解码JSON数据的能力?
我尝试过同时使用所有3个主要的解析器,但是没有成功(通过将API视图的parser_类设置为它们:
parser_classes = (MultiPartParser, JSONParser, FormParser)
以下是一些通过Chrome的开发工具发送的请求示例:
标准Post(非多部分,无文件):
{"first_name":"Test","last_name":"Shmest","email":[{"channel_type":"Email","value":"test@example.com","name":null,"default":false}],"company":{"position":"Manager","id":"735d2b5f-e032-4ca8-93e4-c7773872d0cc","name":"The Compapa"},"access":{"private":true,"users":[10,1]},"description":"Nice guy!!","address":{"city":"San Fanfanfo","zip":"39292","country":"United States of America","state":"CA","map_url":null,"country_code":"US","address":"123 This street"},"phone":[{"default":false,"type":"Phone","id":"70e2b437-6841-4536-9acf-f6a55cc372f6","value":"+141512312345","name":null}],"position":"","department":"","supervisor":"","assistant":"","referred_by":"","status":"","source":"","category":"Lead","do_not_call":false,"do_not_text":false,"do_not_email":false,"birthday":null,"identifier":""}
DRF可以很好地读取这个有效负载,并且所有值都设置为它们的本机等效值。在
文件的多部分,其中一个字段是JSON编码的对象:
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="file"; filename="image.png"
Content-Type: image/png
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="first_name"
Test
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="last_name"
Shmest
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="email"
[{"channel_type":"Email","value":"test@example.com","name":null,"default":false}]
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="company"
{"position":"Manager","id":"735d2b5f-e032-4ca8-93e4-c7773872d0cc","name":"The Compapa"}
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="access"
{"private":true,"users":[10,1]}
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="description"
Nice guy!!
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="address"
我要寻找的是,在我深入到手动解码所有字段以检查它们是否是JSON之前,是否有某种方法可以像在常规POST中那样在多部分请求中自动解码JSON。在请求发出之前,我将获得的大多数字段对我来说都是未知的,因为每个用户可能有不同的字段组合。在
我创建了一个新的Parser对象来处理这个包含JSON字段的多部分文件上传场景。如果有人需要的话,代码在下面。在
解析器可以在API视图中使用,就像任何其他解析器一样:
parser_classes = (MultiPartJSONParser, JSONParser , FormParser)
相关问题 更多 >
编程相关推荐