如何通过App Engine的Task Queue Python API传递压缩数据?

1 投票
2 回答
1177 浏览
提问于 2025-04-15 18:37

我正在尝试在任务队列中使用压缩数据,像这样:

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)

有人知道这是怎么回事吗?有没有解决办法?

2 个回答

2

阅读一下文档...(我特别强调!):

params 是一个参数字典,用于这个任务。字典里的值可以是可迭代的,表示重复的参数。如果已经指定了负载(payload),那么在POST请求中就不能再指定这些参数。对于POST请求,这些参数会被编码为 'application/x-www-form-urlencoded' 并设置为负载;而对于其他方法,参数会被转换为查询字符串。如果URL已经包含查询字符串,并且方法是GET,就不能再指定这些参数。

zlib.compress 会生成一串任意的字节字符串……但是查询字符串转换会把它当作Unicode来解释!所以,使用任何一种1字节的编码,比如latin-1,来.encode压缩后的结果,以便传递(实际上是二进制的)参数字节字符串,然后用同样的编码来.decode,把从“unicode”字符串转换回可以decompress的字节字符串。呼……你确定压缩对你应用的性能来说足够重要,值得这么麻烦的操作吗?不如直接不做压缩更好?-)

5

与其使用参数(params),不如使用负载(payload),它会把你的数据放在请求的主体部分,而且是未编码的。这样你就可以用 zlib.decompress(self.request.body) 来获取这些数据。

撰写回答