у меня
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 в строку, вызывая исключение
urlHash
UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xfe в позиции 0: порядковый номер не в диапазоне (128)
Похоже, это будет работать, если вы явно сделаете хеш в ByteString:
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)
Одно решение, которое я нашел, - это ручное кодирование в base64
urlHash = hasher.digest().encode('base64')
. Я заметил, что помимо имени исключения, равного UnicodeDecodeError, оно происходит и при кодировании.
UnicodeDecodeError