我正在尝试将压缩数据与任务队列中的任务一起使用,如下所示:
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)
任何人都知道这里发生了什么?有工作吗?
答案 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 ...你确定压缩对你的应用程序的性能至关重要,值得这个奇怪的回转,或者避免它更好? - )