2011-03-08 123 views
1

我有如何通過Google App Engine中的ByteString字段查詢過濾?

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' codec can't decode byte 0xfe in position 0: ordinal not in range(128)

+0

PLS顯示設置urlHash用於查詢的代碼。 – cope360 2011-03-08 20:18:05

+0

@ cope360我將代碼添加到問題主體 – 2011-03-08 21:31:27

+0

您可以包含例外的完整堆棧跟蹤嗎? – 2011-03-09 00:22:34

回答

1

看起來它會工作,如果你明確地使散列成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

我現在無法測試它,但它似乎是合理的 – 2011-03-09 14:19:46

0

一種解決方案,我發現是手動編碼爲Base64

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

我注意到,除了例外的名稱是UnicodeDecodeError,它也發生在編碼上。

相關問題