Сборка данных multipart / form с двоичными данными изображения в Django дает мне UnicodeDecodeError - PullRequest
2 голосов
/ 19 ноября 2011

--- Отредактировано ниже с дополнительным тестированием, пожалуйста, прочитайте :) ---

Я изо всех сил пытаюсь построить тело из нескольких частей / форм-данных в Python, в основном я делаю это с буфером строк в списке, а затем пытаюсь присоединиться к ним, вот код:

fp = open(filename, 'rb')

BOUNDARY = 's0m3r4ndomB0unD4ry'
body = []

body.append('--' + BOUNDARY)
body.append('Content-Disposition: form-data; name="image"; filename="%s"' % filename)
body.append('Content-Type: %s' % file_type)
body.append('')
body.append(fp.read())
body.append('--' + BOUNDARY + '--')
body.append('')
fp.close()
body = '\r\n'.join(body)

Сначала это казалось простым, и этот код работает в оболочке Python, но при интеграции с моим приложением Django он просто выдает UnicodeDecodeError с таким сообщением: 'ascii' codec can't decode byte 0x89 in position 0: ordinal not in range(128)

Я не могу понять, почему это происходит только внутри приложения Django, а не в оболочке, кто-то может просветить меня?

РЕДАКТИРОВАТЬ : После некоторого тестирования я обнаружил, что рецепт на сайте ActiveState содержит комментарий с обходным решением:

body = CRLF.join([element.decode('string_escape') for element in L])

Это остановило UnicodeDecodeError от броска, но портит некоторые изображения, поэтому для меня это не исправлено: /

Что странно, так это то, что это происходит только в веб-приложении Django, если я запускаю ту же команду с python manage.py shell, она будет работать, как и ожидалось, даже без вышеупомянутого исправления.

Кто-нибудь знает, какая разница в среде между оболочкой и веб-сервером может вызвать эту проблему?

1 Ответ

4 голосов
/ 22 ноября 2011

Скорее всего, вы предоставляете все значения str при тестировании кода из оболочки, в то время как приложение Django возвращает значения формы (например, имя файла) как unicode. Затем ваш оператор соединения пытается преобразовать прочитанное содержимое файла из str в unicode при соединении их с остальной частью тела, что приводит к ошибке.

Либо проверьте тип всего, что добавлено к телу, чтобы убедиться, что это так, либо попробуйте преобразовать каждый сегмент body в str до объединения:

body = [str(seg) for seg in body]
body = '\r\n'.join(body)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...