Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django rest中放置图像上载请求不起作用_Python_Django_Rest_Pillow - Fatal编程技术网

Python 在django rest中放置图像上载请求不起作用

Python 在django rest中放置图像上载请求不起作用,python,django,rest,pillow,Python,Django,Rest,Pillow,我试图在django rest中使用PUT请求和枕头中的multipart/form data上传图像: class ABC(APIView): parser_classes = (MultiPartParser,) def put(self, request): a = Image() a.image_url = request.data["image"] a.save() class Image(models.Model):

我试图在django rest中使用
PUT
请求和枕头中的
multipart/form data
上传图像:

class ABC(APIView):
    parser_classes = (MultiPartParser,)
    def put(self, request):
        a = Image()
        a.image_url = request.data["image"]
        a.save()

class Image(models.Model):
      image_url = models.ImageField(upload_to='static/bills', blank=True)
我发出一个请求,它是PUT请求和多部分/表单数据。我最终得到了一个400的响应代码,其中包含以下消息:

{
  "detail": "Multipart form parse error - Invalid boundary in multipart: None"
}
不知怎的,这东西刚才坏了。当我第一次写它的时候,它工作得很好。此后,我为CORS请求添加了一些设置配置,如:

CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_HEADERS = (
    'x-requested-with',
    'content-type',
    'accept',
    'origin',
    'authorization',
    'x-csrftoken',
    'token',
    'x-device-id',
    'x-device-type',
    'x-push-id',
    'dataserviceversion',
    'maxdataserviceversion'
)
CORS_ALLOW_METHODS = (
        'GET',
        'POST',
        'PUT',
        'PATCH',
        'DELETE',
        'OPTIONS'
    )
有什么想法吗

选项请求响应:

Access-Control-Allow-Headers → x-requested-with, content-type, accept, origin, authorization, x-csrftoken, token, x-device-id, x-device-type, x-push-id, dataserviceversion, maxdataserviceversion
    Access-Control-Allow-Methods → GET, POST, PUT, PATCH, DELETE, OPTIONS
    Access-Control-Allow-Origin → *
    Access-Control-Max-Age → 86400
    Allow → GET, POST, DELETE, HEAD, OPTIONS
    Content-Type → application/json
    Date → Fri, 21 Aug 2015 06:23:28 GMT
    Server → WSGIServer/0.1 Python/2.7.6
    Vary → Accept
    X-Frame-Options → SAMEORIGIN

您通常希望同时使用FormParser和MultiPartParser来完全支持HTML表单数据。

您的错误告诉您,请求的
多部分/表单数据的边界无效,尤其是
无。根据设计,这将返回
400
(“错误请求”)响应代码。出现错误

输入
边界
等于
的代码分支意味着在请求的
内容类型
标题中未指定
边界
选项

内容类型
中使用
多部分/表格数据
时,必须指定
边界
,具体参见第5.1.1节中的规定

多部分实体的内容类型字段需要一个参数, “边界”

您说它以前工作过,因此您应该检查用于发出请求的代码-某些内容必须已更改,这意味着
内容类型中未指定
边界


N.B.我假设请求是由代码生成的,因此,如果HTML是
GET
而不是
PUT
,那么浏览器生成的请求可以解决这一问题

能否将浏览器请求添加为嗅探器捕获的请求?没有嗅探器。我正在使用邮递员发出此请求。您能否将
OPTIONS
请求发送到同一URL并检查响应是什么?对于有效的CORS服务,响应应该是一个空的
200 OK
响应,带有头,如
Access Control Allow Methods,Access Control Allow Origin
等。因此,在大量搜索解决方案后,从PostManager请求头+表单数据,我发现从请求中删除
内容类型
头可以解决这个问题。您可以共享我应该用于此类请求的curl请求吗?我对它不太熟悉,对api的怀疑让我对curl请求感到困惑。类似于
curl-v-XPUT-H“Content Type:multipart/form data;boundary=------------------------------------4ebf00fbcf09”--data binary@test.jpg http://
的内容类型应该可以工作,其中
boundary=
后面的字符串是任意的,但不应出现在以下数据中。我假设您的图像数据在一个名为
“test.jpg”
的文件中,但您也可以将原始数据放在那里。我不熟悉postman,因此无法对如何通过该工具生成请求发表评论。如果上面的
curl
有效,我可以将其复制到答案中以使其完整。Hmmm-不确定curl命令是否有效。似乎表明1)您应该使用不获取内容类型
multipart/form data
2)这些将被编译成
POST
请求。我不确定
-xput
是否会覆盖此功能,但我怀疑不会(目前还没有一个可以轻松测试的环境)。使用
PUT
而不是
POST
似乎有点不寻常-你这样做是有原因的吗?嗨@VarunJain,我想知道你是否能做到这一点/这个答案是否对你有帮助。我不想让你的赏金白白浪费掉——如果你还在挣扎,也许我可以帮你调试多一点……:)如果您使用的是POSTMAN,则可以在其中查看不同语言的请求代码。这是个线索,对我也有帮助!谢谢你,伙计,但有一个问题:你知道为什么它会起作用吗?只是碰巧发生在我身上。如果您为正文选择“表单数据”,则Postman将自动添加带有边界的内容类型标题。但是,如果您指定自己的内容类型标题而没有边界,那么邮递员将不会覆盖您提供的标题,或者该标题加倍,服务器仅读取遇到的第一个内容类型标题。如何从标题中删除该内容类型?天哪,您救了我!谢谢