使用urllib发送pickle数据字符串
我需要把数据发送到一个Django服务器。我想用pickle来处理这些数据。(这个应用没有安全要求——只是个小型内网应用。)
首先,我在客户端用pickle把数据处理好,然后用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字符串。那么我该怎么把它转换回来,以便再次进行解压缩(loads)呢?
顺便说一下,使用pickle的格式0(ascii)是可以的。我可以在解压缩之前把它转换成字符串,但我更想用格式2。
另外,关于如何将二进制数据发送到Django视图的建议也非常欢迎。
1 个回答
2
显然,
urllib.urlencode
创建了一个 Unicode 字符串。
urllib.urlencode
并不会返回 Unicode 字符串。
可能是你使用的网络框架的特性,导致 request.POST
包含了 Unicode 字符串。
不要使用 pickle
在服务之间进行通信,因为它不安全、容易出错、不便于移植、难以调试,并且会让你的组件之间的关系变得过于紧密。