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

paramsを使用する代わりに、エンコードされていない、リクエストの本文にデータを含むペイロードを使用します。次に、を使用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.decodedecompress

于 2010-01-29T05:29:56.610 に答える