如何使用App Engine中的Task Queue Python API传递压缩数据?

时间:2010-01-29 05:11:54

标签: python google-app-engine zlib task-queue

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

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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

阅读the docs ...(我的重点!):

  

params要使用的参数字典   这个任务。价值观   字典可以迭代表示   重复参数。未必   如果为POST请求指定   已指定有效负载。对于POST   请求,这些参数将被编码   作为'application / x-www-form-urlencoded'   并设置为有效载荷;为了所有其他   方法,参数将是   转换为查询字符串。不得   如果URL已经指定   包含查询字符串和方法   是GET。

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