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

标签 python google-app-engine namespaces

我正在尝试检索使用 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/

    相关文章:

    python - 将 dict 的嵌套列表展平为 Pandas Dataframe

    python - 如何将子查询结果联接到函数结果

    python:避免在循环赋值之前使用变量的错误

    python - 我如何将我的想法转移到 'vectorize my computation' 而不是使用 'for-loops' ?

    java - 使用 AppEngine 获取 Https URL

    javascript - Meteor JS 框架与 Google App Engine 兼容吗?

    google-app-engine - 使用 Google App Engine 和 JDO 进行全文搜索?

    c++ - 编译器找不到重载

    javascript - 使用 JavaScript 删除 XML 命名空间的简单方法?

    python - 如何根据浮点值从字典中随机选择一个键