使用urllib发送pickle数据字符串

0 投票
1 回答
1364 浏览
提问于 2025-04-17 02:54

我需要把数据发送到一个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 在服务之间进行通信,因为它不安全、容易出错、不便于移植、难以调试,并且会让你的组件之间的关系变得过于紧密。

撰写回答