Django / httplib: передача request.raw_post_data с помощью httplib - PullRequest
2 голосов
/ 05 июля 2011

"AAaarg"! Пожалуйста, помогите !!!

Вот что я пытаюсь сделать ...

У меня есть сайт Django site1, которому требуется доступ к API другого сервиса site2. Однако для этого site1 необходимо использовать свои учетные данные для входа и прочее ...

Поэтому я написал небольшое приложение Django, которое дублирует URL-адреса site2, но под капотом использует httplib2 для передачи запроса почти идентично (только аутентификация и прочее). Он прекрасно работает в большинстве случаев, и раньше он действительно отлично работал во всех случаях (я не знаю, что именно сломало его, возможно, обновление Python 2.6 -> 2.7).

Чтобы передать данные POST / PUT как есть, я получаю их с помощью:

post_data = request.raw_post_data

А затем отправьте его с httplib2:

response, content = c.request(
    url,
    method,
    post_data,
    headers=headers,
)

Проблема возникает при публикации multipart-data , содержащей двоичные данные, такие как изображение. httplib (поверх которого строится httplib2) при построении строки запроса пытается объединить мой post_data с некоторыми сгенерированными заголовками и прочим. И похоже, что request.raw_post_data имеет тип string, в то время как сгенерированный материал unicode. Поэтому он пытается декодировать мой post_data (который содержит двоичные данные) и выходит из себя !!!

c.f. httplib строка 807:

if isinstance(message_body, str):
    msg += message_body

Вот выдержка из message_body (получено с request.raw_post_data):

'-----------------------------697585321193462802080194682\r\nContent-Disposition: form-data; name="_method"\r\n\r\nPUT\r\n-----------------------------697585321193462802080194682\r\nContent-Disposition: form-data; name="jpegPhoto"; filename="crap.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xfe\x00\x13Created with GIMP\xff\xdb\x00C\x00\x05\x03\x04\x04\x04\x03\x05\x04\x04\x04

Вот содержание msg:

u'POST /user/spiq/?username=spiq HTTP/1.1\r\nContent-Length: 40307\r\naccept-language: en-us,en;q=0.5\r\naccept-encoding: gzip, deflate\r\nhost: localhost:8000\r\naccept: application/json\r\nuser-agent: Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0\r\naccept-charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nconnection: keep-alive\r\nreferer: \r\ncookie: csrftoken=d9a3e014e5e366ee435b27ae7fc122af; sessionid=d5492a8d640e346b8ca56fa87e5cc439\r\ncontent-type: multipart/form-data\r\n\r\n'

Так что в принципе это обречено ...

Есть идеи, как мне поступить? Могу ли я превратить мой post_data в unicode, не расшифровывая его?

1 Ответ

1 голос
/ 05 июля 2011

Исходя из этого: http://bugs.python.org/issue11898#msg138059 похоже, что вы можете быть в порядке, если убедитесь, что аргумент url приведен к str.

...