PUT请求图片上传无法在django休息

时间:2015-08-14 19:05:51

标签: python django rest pillow

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

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请求和一个multipart / form-data。我最终得到的响应代码为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

3 个答案:

答案 0 :(得分:19)

从标题中删除内容类型可解决此问题。

答案 1 :(得分:2)

您的错误告诉您,您的multipart/form-data请求内容的边界无效 - 尤其是None。根据设计,这将返回400(“错误请求”)响应代码。错误被引发here in the django code

要输入boundary等于None的代码分支,意味着您的请求的boundary标题中未指定content-type选项。

RFC2046 RFC2388中指定的boundary中使用multipart/form-data时必须指定content-type(特别是<form method="put"> is invalid HTML引用) - 特别是第5.1.1节< / p>
  

多部分实体的Content-Type字段需要一个参数,      “边界”。

您说它之前已经有效,所以您应该检查您用来发出请求的代码 - 必须更改某些内容以表示boundary中未指定content-type

NB 我认为请求是代码生成的,因为https://unix.stackexchange.com/questions/196603/can-someone-explain-in-detail-what-set-m-does因此浏览器生成的请求是HTML {{1}而不是GET

答案 2 :(得分:1)

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