2012-01-23 14 views
0

我從這一行代碼在我的GAE Python應用程序得到一個PicklingError:PicklingError:不能鹹菜<class ...>:這是不一樣的對象......在GAE

deferred.defer(email_voters_begin, ekey, voter_list) 

三個參數:。

  • email_voters_begin - 甲Python函數,例如,在0x1035d4488
  • EKEY功能email_voters_begin - A鍵予定義的實體,例如,打印爲agdvcGF2b3Rlcg4LEghFbGVjdGlvbhgCDA
  • voter_list - 對象的列表我所定義,例如,[在0x103d3d310 models.Voter對象,...]

當此行執行作爲我的測試部分(與WebTest的和nosegae),I出現以下錯誤:

Traceback (most recent call last): 
    [...] 
    File "/Users/joneill/OpenSTV/OpenSTV/trunk/OpaVote-HR/tasks.py", line 29, in init_voters_and_send_email 
    deferred.defer(email_voters_begin, ekey, voter_list) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/deferred/deferred.py", line 249, in defer 
    pickled = serialize(obj, *args, **kwargs) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/deferred/deferred.py", line 221, in serialize 
    return pickle.dumps(curried, protocol=pickle.HIGHEST_PROTOCOL) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps 
    Pickler(file, protocol).dump(obj) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump 
    self.save(obj) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    [...] 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 396, in save_reduce 
    save(cls) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 753, in save_global 
    (obj, module, name)) 
PicklingError: Can't pickle <class 'google.appengine.ext.blobstore.blobstore.BlobInfo'>: it's not the same object as google.appengine.ext.blobstore.blobstore.BlobInfo 

注意,Voter實體deferred.defer()通過沒有BlobReference屬性,但該Voter實體確實有ReferenceProperty到確實有BlobReference財產另一個實體。我不認爲有任何BlobInfo對象會成爲泡菜的一部分,但錯誤表明其中包含了一個對象。

當我使用dev服務器從瀏覽器窗口運行相同的代碼時,不會發生此錯誤。

我難以理解如何調試此任何想法將不勝感激。

回答

1

這是可能發生的,因爲你已經在選民對象中的至少一個檢索到的ReferenceProperty。取消引用ReferenceProperty後,模型實例將緩存它。酸洗也醃製任何緩存的對象,因此它會嘗試序列化實例,引用的實例和其BlobInfo。通常,正如Skirmantas指出的那樣,將模型實例傳遞給延遲通常是一個壞主意。在可能的情況下,發送密鑰,如果沒有,則將實例序列化爲協議緩衝區,然後發送這些實例。

1

您不應該將模型的實例傳遞給延遲。使用鍵改爲:

deferred.defer(email_voters_begin, ekey, [v.key() for v in voter_list]) 

在你email_voters_begin:

def email_voters_begin(ekey, voters_keys): 
    voter_list = models.Voter.get(voters_keys) 
相關問題