2010-01-29 17 views
1

Je suis en train d'utiliser des données compressées avec mes tâches dans la file d'attente des tâches comme ceci:Comment transmettre des données compressées à l'aide de l'API Python Task Queue dans App Engine?

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

Cependant lorsque je tente de le décompresser dans le gestionnaire de file d'attente comme si

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

Je reçois ce erreur:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u06b8' in position 2: ordinal not in range(128)

Quelqu'un sait-il ce qui se passe ici? Y at-il un travail autour?

Répondre

5

Au lieu d'utiliser params, utilisez la charge utile , qui inclut vos données dans le corps de la requête, non codé. Ensuite, vous pouvez utiliser zlib.decompress(self.request.body) pour récupérer les données.

+0

Oh ... duh! :) Merci, Nick! – Ivan

2

Lire the docs ... (mon accent!):

params Dictionary of parameters to use for this Task. Values in the dictionary may be iterable to indicate repeated parameters. May not be specified for a POST request if payload is already specified. For POST requests, these params will be encoded as 'application/x-www-form-urlencoded' and set to the payload; for all other methods, the parameters will be converted to a query string. May not be specified if the URL already contains a query string and the method is GET.

zlib.compress produit une chaîne arbitraire d'octets ... mais la conversion de chaîne de requête interprète comme Unicode! Donc, utilisez un codec 1 octet, tel que latin-1, à .encode les résultats compressés afin de passer (ce qui est en fait un binaire) bytestring de params, et le même codec pour un .decode de revenir de la chaîne "unicode" à un chaîne d'octets que vous pouvez decompress. Ouf ... vous que la compression est assez crucial pour la performance de votre application à une valeur de cet ensemble bizarre de girations, ou ne serait-il préférable de éviter ce -?)

+0

Merci, Alex! Je passe essentiellement un morceau de html récupéré à un gestionnaire pour analyser et traiter. Je dois utiliser la compression pour maintenir l'objet Tâche sous 10 Ko. Je suppose que je pourrais stocker le code HTML dans le magasin de données et ensuite passer une clé au gestionnaire à la place, mais cela semble gaspiller du quota pour le moment. – Ivan