Google App Engine中的KindError

时间:2011-04-11 11:05:05

标签: python google-app-engine

我在GAE中定义了一个简单的类来保存用户配置文件数据,如下所示:

class User(db.Model):
    email = db.EmailProperty()
    role = db.StringProperty(default=roles.USER)
    first_name = db.StringProperty()
    last_name = db.StringProperty()
...

我使用memcache来保存会话信息。 memcache数据看起来像这个{ 'key': 'agpjYW5kaXJhdGVzcgoLEgRVc2VyGCMM'}。我从Cookie中获得session_id值。当我尝试将用户信息链接到该cookie时,如下所示:

session_id = request['session_id']
data = memcache.get(session_id)
user = User.get(data['key'])

我得到KindError例外:

KindError: Kind 'User' is not a subclass of kind 'User'

我知道这个用户存在,memcache存在。用户类在我的项目中只定义一次。为什么会出现此错误以及如何使其生效?

更新:我尝试使用db.get()代替User.get(),但它确实有效。那么,问题是什么呢?

3 个答案:

答案 0 :(得分:1)

Model.get()会检查提供的密钥是否正确,如documentation中所定义。如果不是正确类型,它将抛出KindError

db.get()不进行任何类型检查,因此如果数据存储中存在提供的值,则会成功,但不一定会返回用户实体。

因此,您需要检查内存缓存中的密钥是否实际属于User种类。你确定它在某些时候没有被不同型号的键覆盖吗?

答案 1 :(得分:0)

App Engine框架将一个名为“User”的类定义为Users API的一部分。此外,您拥有自己的同名类。当异常发生时,你试图使用一个,但是获得另一个。

要避免这种情况,请重命名模型。您还应该小心如何在Python中导入模块。而不是:

from google.appengine.api.users import User

或更糟:

from google.appengine.api.users import *

你应该使用:

from google.appengine.api import users

然后参考users.User,这是明确的。

答案 2 :(得分:0)

在我看来,问题比这更微妙。我通过调用Model.get()得到了错误(我正在检索顶级单例对象,总是在那里):

datastore = GDSDatastore.get(gds.Key.from_path(*path))

所以我调查了这段代码:

datastore = gds.get(gds.Key.from_path(*path))
if not(datastore is None or isinstance(datastore, GDSDatastore)):
    logger.error("KindError isinstance(GDSDatastore)=%s class=%s" % (isinstance(datastore, GDSDatastore), datastore.__class__.__name__))
    raise gds.KindError('Kind %r is not a GDSDatastore instance' %
                    (datastore.kind()))

绝大多数时候我没有错误,但今天我得到了这个有趣的日志:

KindError isinstance(GDSDatastore)=False class=GDSDatastore

现在,这让我感到非常特别。

(注意:GDSDatastore在本地定义:类GDSDatastore(gds.Model))