我需要将数据发布到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视图的建议。
答案 0 :(得分:2)
显然,urllib.urlencode创建了一个unicode字符串。
urllib.urlencode
不返回Unicode字符串
它可能是您使用的request.POST
包含Unicode字符串的Web框架的一个功能。
不要使用pickle
在服务之间进行通信,它不安全,易碎,不便携,难以调试,而且会使您的组件过于耦合。