使用urllib发布pickle dumps字符串

时间:2011-09-23 10:03:58

标签: python django encoding pickle urllib

我需要将数据发布到Django服务器。我想用泡菜。 (没有安全要求 - >小型内联网应用。)

首先,我在客户端上挑选数据并使用urllib2发送它

def dispatch(self, func_name, *args, **kwargs):
    dispatch_url = urljoin(self.base_url, "api/dispatch")
    pickled_args = cPickle.dumps(args, 2)
    pickled_kwargs = cPickle.dumps(kwargs, 2)
    data = urllib.urlencode({'func_name' : func_name,
                             'args' : pickled_args,
                             'kwargs': pickled_kwargs})
    resp = self.opener.open(dispatch_url, data)

在服务器上接收数据也是有效的:

def dispatch(request):
    func_name = request.POST["func_name"]
    pickled_args = request.POST["args"]
    pickled_kwargs = request.POST["kwargs"]

但unpickling会引发错误:

cPickle.loads(pickled_args)

Traceback (most recent call last):
File "<string>", line 1, in <fragment>
TypeError: must be string, not unicode

显然urllib.urlencode创建了一个unicode字符串。但是我怎样才能将它转换回来再次解开(laods)?

顺便说一句,使用pickle格式0(ascii)可行。我可以在unpickling之前转换为字符串,但我宁愿使用格式2.

此外,我们非常赞赏有关如何将二进制数据提供给Django视图的建议。

1 个答案:

答案 0 :(得分:2)

  

显然,urllib.urlencode创建了一个unicode字符串。

urllib.urlencode不返回Unicode字符串 它可能是您使用的request.POST包含Unicode字符串的Web框架的一个功能。

不要使用pickle在服务之间进行通信,它不安全,易碎,不便携,难以调试,而且会使您的组件过于耦合。