2011-03-08 2 views
1

JeComment faire pour interroger le filtrage par un champ ByteString dans Google App Engine?

class Map(db.Model): 
    urlHash= db.ByteStringProperty() 

hasher = hashlib.sha256() 
hasher.update(staticMapUrl) 
urlHash = hasher.digest() 
query = db.Query(models.Map) 
query = query.filter('urlHash =', urlHash) 
results = query.fetch(1) 

et ce type de requête essaye de décoder le urlHash à une chaîne, lancer une exception

UnicodeDecodeError: 'ascii' codec can't decode byte 0xfe in position 0: ordinal not in range(128)

+0

Pls montrent le code qui définit urlHash pour la requête. – cope360

+0

@ cope360 J'ai ajouté le code au corps de la question –

+0

Pouvez-vous inclure la pile complète de l'exception, s'il vous plaît? –

Répondre

1

On dirait que ça ne fonctionnera que si vous faites explicitement le hachage dans un ByteString:

from google.appengine.api.datastore_types import ByteString 

hasher = hashlib.sha256() 
hasher.update('http://www.google.com/') 
urlHash = hasher.digest() 
bs = ByteString(urlHash) 

m = Map(urlHash=bs).put() 

query = db.Query(Map) 
query = query.filter('urlHash =', bs) 
results = query.fetch(1) 
+0

Je ne peux pas le tester maintenant, mais il semble raisonnable –

0

Une solution que j'ai trouvé est d'encoder manuellement base64

urlHash = hasher.digest().encode('base64') 

J'ai noté que, à part le nom de l'exception UnicodeDecodeError, il se produit également lors du codage.

Questions connexes