Как передать сжатые данные с помощью Python API очереди задач в App Engine? - PullRequest
1 голос
/ 29 января 2010

Я пытаюсь использовать сжатые данные с моими Задачами в Очередь Задач, например:

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

Однако, когда я пытаюсь распаковать его в обработчике очереди, вот так

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

Я получаю эту ошибку:

UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ u06b8' в позиции 2: порядковый номер не в диапазоне (128)

Кто-нибудь знает, что здесь происходит? Есть ли работа вокруг?

Ответы [ 2 ]

5 голосов
/ 29 января 2010

Вместо использования параметров используйте полезную нагрузку, которая включает ваши данные в теле запроса в незашифрованном виде. Затем вы можете использовать zlib.decompress(self.request.body) для извлечения данных.

2 голосов
/ 29 января 2010

Читать Документы ... (мой акцент!):

params Словарь параметров для использования для этой задачи. Значения в словарь может быть итеративным для указания повторные параметры. Может не быть указано для запроса POST, если полезная нагрузка уже указана. Для POST запросы, эти параметры будут закодированы как 'application / x-www-form-urlencoded' и установить на полезную нагрузку; для всех остальных методы, параметры будут преобразован в строку запроса . Может нет указать, если URL уже содержит строку запроса и метод ПОЛУЧИТЬ.

zlib.compress создает произвольную строку байтов ... но затем преобразование строки запроса интерпретирует его как Unicode! Итак, используйте любой 1-байтовый кодек, такой как latin-1, для .encode сжатых результатов, чтобы передать (что на самом деле является двоичным) строку параметров, и тот же кодек для .decode для возврата из "Unicode" строка в строку байтов, которые вы можете decompress. Фуф ... ты уверен сжатие достаточно важно для производительности твоего приложения, чтобы стоить этого странного набора вращений, или не лучше ли его избегать? -)

...