2011-04-22 14 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