Django / httplib:使用httplib传输request.raw_post_data

时间:2011-07-05 12:52:35

标签: python django unicode encoding httplib

“AAaarg”!请HeLp !!!

这是我想要做的......

我有一个Django网站site1,需要访问其他服务site2的API。但是,为了做到这一点,site1需要使用自己的登录凭据和东西......

因此,我编写了一个小型Django应用程序,它复制了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_datastring类型,而生成的内容是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 个答案:

答案 0 :(得分:1)

从这个:http://bugs.python.org/issue11898#msg138059如果确保将url参数强制转换为str,您似乎可以。