PUT 图片上传请求在 django rest 中不起作用
PUT request for image upload not working in django rest
我正在尝试在 PUT
请求和 Pillow 中使用 multipart/form-data
在 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'
)
有什么想法吗?
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 表单数据。
您的错误告诉您您请求的 multipart/form-data
内容的边界无效 - 特别是 None
。这在设计上是 returns 一个 400
("Bad Request") 响应代码。出现错误 here in the django code。
输入 boundary
等于 None
的代码分支意味着 boundary
选项未在您请求的 content-type
header 中指定.
boundary
在 content-type
中使用 multipart/form-data
时必须指定 RFC2046 (referred to by RFC2388) - 特别是第 5.1.1 节
The Content-Type field for multipart entities requires one parameter,
"boundary".
你说它以前有效,所以你应该检查你用来发出请求的代码 - 一定有什么改变意味着 boundary
没有在 content-type
中指定.
N.B. 我假设请求是 code-generated,因为 <form method="put">
is invalid HTML 等等由浏览器生成的请求,假设 HTML 将是 GET
而不是 PUT
.
从 headers 中删除 content-type 解决了这个问题。
我正在尝试在 PUT
请求和 Pillow 中使用 multipart/form-data
在 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'
)
有什么想法吗?
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 表单数据。
您的错误告诉您您请求的 multipart/form-data
内容的边界无效 - 特别是 None
。这在设计上是 returns 一个 400
("Bad Request") 响应代码。出现错误 here in the django code。
输入 boundary
等于 None
的代码分支意味着 boundary
选项未在您请求的 content-type
header 中指定.
boundary
在 content-type
中使用 multipart/form-data
时必须指定 RFC2046 (referred to by RFC2388) - 特别是第 5.1.1 节
The Content-Type field for multipart entities requires one parameter, "boundary".
你说它以前有效,所以你应该检查你用来发出请求的代码 - 一定有什么改变意味着 boundary
没有在 content-type
中指定.
N.B. 我假设请求是 code-generated,因为 <form method="put">
is invalid HTML 等等由浏览器生成的请求,假设 HTML 将是 GET
而不是 PUT
.
从 headers 中删除 content-type 解决了这个问题。