我在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()
,但它确实有效。那么,问题是什么呢?
答案 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))