Подтвердить что ты не робот

Запрос PUT для загрузки изображения не работает в django rest

Я пытаюсь загрузить изображение в django rest с помощью multipart/form-data в запросе PUT и Pillow:

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
4b9b3361

Ответ 1

Удаление содержимого содержимого из заголовков разрешает это.

Ответ 2

Как правило, вы хотите использовать как FormParser, так и MultiPartParser вместе, чтобы полностью поддерживать данные формы HTML.

Ответ 3

В вашей ошибке сообщается, что граница для вашего multipart/form-data содержимого вашего запроса недействительна - в частности, это None. Это, по дизайну, возвращает код ответа 400 ( "Плохой запрос" ). Ошибка возникает здесь, в коде django.

Чтобы ввести ветвь с тегом boundary, равным None, означает, что параметр boundary не указан в заголовке content-type вашего запроса.

boundary должен быть указан при использовании multipart/form-data в content-type, как указано в RFC2046 (ссылка на RFC2388) - в частности, раздел 5.1.1

Поле Content-Type для многочастных объектов требует одного параметра,     "Граница".

Вы говорите, что это сработало раньше, поэтому вы должны проверить код, который вы используете для выполнения запроса, - что-то должно было измениться, чтобы означать, что boundary не указано в content-type.

NB Я предполагаю, что запрос генерируется кодом, поскольку <form method="put"> является недопустимым HTML, и поэтому запрос, сгенерированный браузером что HTML будет GET, а не PUT.