1

我正在尝试将压缩数据与任务队列中的任务一起使用,如下所示:

t = taskqueue.Task(url='/tasks/queue',
                   params={'param': zlib.compress(some_string)}

但是,当我尝试像这样在队列处理程序中解压缩它时

message = self.request.get('param')
message = zlib.decompress(message)

我收到此错误:

UnicodeEncodeError:'ascii' 编解码器无法在位置 2 编码字符 u'\u06b8':序数不在范围内(128)

有人知道这里发生了什么吗?有解决办法吗?

4

2 回答 2

5

不要使用参数,而是使用有效负载,它将您的数据包含在请求正文中,未编码。然后您可以使用zlib.decompress(self.request.body)来检索数据。

于 2010-01-29T10:24:36.783 回答
2

阅读文档...(我的重点!):

params 用于此任务的参数字典。字典中的值可能是可迭代的以指示重复的参数。如果已指定有效负载,则可能不会为 POST 请求指定。对于 POST 请求,这些参数将被编码为 'application/x-www-form-urlencoded' 并设置为有效负载;对于所有其他方法,参数将被转换为查询字符串。如果 URL 已包含查询字符串且方法为 GET,则可能不指定。

zlib.compress产生一个任意的字节串......但是查询字符串转换将其解释为Unicode!因此,对压缩结果使用任何 1 字节编解码器,例如latin-1.encode以便传递参数的(实际上是二进制的)字节串,以及.decode从“unicode”字符串返回到字节串的相同编解码器你可以decompress。呼……您确定压缩对您的应用程序的性能至关重要,值得这些奇怪的旋转,还是避免它更好?-)

于 2010-01-29T05:29:56.610 回答