2011-04-22 13 views
0

我試圖檢索一些使用Datastore存儲的OAuth信息,但在實例化我的OAuthConsumer類時出現此錯誤:使用GAE Datastore和名稱空間時的TypeError - 無法檢索實體

TypeError: __init__() got an unexpected keyword argument 'consumer_secret' 

這也是我第一次嘗試使用命名空間,我想知道這是否與它有關。該類如下:

creds = OAuthConsumer('google') 

class OAuthConsumer(db.Model): 
    '''the oauth consumer information''' 
    consumer_key = db.StringProperty() 
    consumer_secret = db.StringProperty() 

    def __init__(self, service): 
     namespace_manager.set_namespace(service) 
     query = db.GqlQuery('SELECT * FROM OAuthConsumer') 
     creds = query.get() 
     self.consumer_key = creds.consumer_key 
     self.consumer_secret = creds.consumer_secret 

下面是我使用數據瀏覽器得到了什麼:

credentials are blocked out

任何想法,我做錯了嗎?

回答

3

您正在覆蓋數據存儲模型類上的__init__方法,並且未將關鍵字參數傳遞給父構造函數(或者根本就不會調用它)。

作爲一般規則,您不應該重寫數據存儲模型類的構造函數。這是可能做是正確的,但它的棘手,它是更安全,提供一個類方法,如工廠,像這樣:

class OAuthConsumer(db.Model): 
    '''the oauth consumer information''' 
    consumer_key = db.StringProperty() 
    consumer_secret = db.StringProperty() 

    @classmethod 
    def new(cls, service): 
     namespace_manager.set_namespace(service) 
     query = db.GqlQuery('SELECT * FROM OAuthConsumer') 
     creds = query.get() 
     return cls(consumer_key=creds.consumer_key, consumer_secret=creds.consumer_secret) 

creds = OAuthConsumer('google') 

你的代碼是不是有點古怪的一對夫婦的原因,但更多:

  • 當構建新實例時,您從另一個(有效)隨機選擇的同一模型實例中獲取並複製字段!
  • 您正在設置構造函數中的名稱空間(或在重寫的版本中,在工廠方法中)。命名空間是一個全局設置,你真的不應該在庫方法中這樣做。之後你也不要把它放回去。
+0

令人驚歎的是,非常感謝評論。我仍然在處理如何處理GAE,以及類和功能,所以這是一個巨大的幫助! – charliesneath 2011-04-22 07:37:02