Как запросить фильтрацию по полю ByteString в Google App Engine? - PullRequest
1 голос
/ 08 марта 2011

у меня

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) 

и этот тип запроса пытается декодировать urlHash в строку, вызывая исключение

UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xfe в позиции 0: порядковый номер не в диапазоне (128)

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Похоже, это будет работать, если вы явно сделаете хеш в 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 голосов
/ 09 марта 2011

Одно решение, которое я нашел, - это ручное кодирование в base64

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

. Я заметил, что помимо имени исключения, равного UnicodeDecodeError, оно происходит и при кодировании.

...