gpt4 book ai didi

python - 使用 GAE 数据存储和命名空间时出现类型错误 - 无法检索实体

转载 作者:行者123 更新时间:2023-12-04 16:59:32 25 4
gpt4 key购买 nike

我正在尝试检索使用 Datastore 存储的一些 OAuth 信息,但是在实例化 OAuthConsumer 类时出现此错误:

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

这也是我第一次尝试 Namespace,我想知道这是否与它有关。类如下:
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

关于我做错了什么的任何想法?

最佳答案

您正在覆盖 __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')

但是,由于以下几个原因,您的代码有点奇怪:
  • 在构建新实例时,您从另一个(有效地)随机选择的同一模型的实例中获取和复制字段!
  • 您在构造函数中(或在重写版本中,在工厂方法中)设置命名空间。命名空间是一个全局设置,你真的不应该在库方法中这样做。之后你也不要把它放回去。
  • 关于python - 使用 GAE 数据存储和命名空间时出现类型错误 - 无法检索实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5751199/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com