2015-03-23 2 views
4

Каждый часть в документе multipart/form-data может иметь свои собственные заголовки, т.е. секция может иметь заголовок Content-Type: text/plain. Например, эти части могут быть загружены из веб-формы.Как настроить заголовки частей multipart/form-data с помощью django.test.Client?

В the documentation for Django's UploadedFile class я прочитал

UploadedFile.content_type

Содержание типа заголовка загружено с файлом (например, текст/простой или применение/PDF). Как и любые данные, предоставленные пользователем, вы не должны верить, что загруженный файл на самом деле является типом. Вам все равно нужно подтвердить, что файл содержит содержимое, которое заголовок заголовка типа содержимого - «доверять, но проверять».

Хорошо, я должен проверить файл по отношению к заявленному типу контента. Поэтому, конечно, теперь мне нужно написать несколько тестов, которые проверяют, действительно ли мой сервер правильно проверяет тип контента. Одним из таких тестов было бы сделать запрос на мой сервер с content-type: multipart/form-data, где хотя бы одна часть имеет контент, который не соответствует его типу содержимого.

Как это сделать? The django.test.Client class has a post method, который может отправлять запросы типа multipart/form-data. Несколько частей тела запроса передаются методу в качестве словаря. Ключи этого словаря являются строками, а значениями являются либо строки, либо «файловые объекты».

Я хочу понять:

  1. как этот словарь превращается в multipart/form-data тело запроса в. Каковы заголовки каждой части?
  2. Как вручную установить произвольные заголовки на каждую часть. Как, например, я могу вручную указать заголовок Content-Type: text/plain?

ответ

3
  1. Тестовый набор Джанго claims он всегда будет использовать application/octet-stream заголовок для файлов. На самом деле это не так, поскольку функция encode_file фактически использует guess фактический тип файла.
  2. Это приводит к ответе на ваш второй вопрос: перед попыткой угадать тип mimetype, функция looks for a content_type атрибут на файл. Вам должен быть в состоянии установить это в любое удобное для вас время и таким образом перезаписать Content-Type.
+0

Это для ответа; это полезно. Я собираюсь оставить его непроверенным, хотя, пока кто-то не может указать мне на документальный API Django, чтобы делать то, что мне нужно. – jameshfisher

+0

Я искал это, но не смог найти его :(Но я, возможно, просто не выглядел достаточно тяжело ... В любом случае, спасибо! –

2

Client класс наследует от django.test.client.RequestFactory (src) и эффективно и вы можете увидеть в post определении Client «s, что это в основном призыв к super, так что вы можете обратиться к RequestFactorypost definition. По умолчанию это в свою очередь вызывает _encode_data, который использует encode_multipart, который, как вы заметили, указывает «multipart/form-data».

Здесь вы можете увидеть, что некоторые заголовки указаны для каждой части (например, Content-Disposition), однако я не вижу способа указать заголовок Content-Type (или любой конкретный заголовок) для каждой части.