Python 谷歌应用引擎中的KindError
我在GAE中定义了一个简单的类,用于保存如下用户配置文件数据:Python 谷歌应用引擎中的KindError,python,google-app-engine,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() ... session_id = request['session_id'] dat
class User(db.Model):
email = db.EmailProperty()
role = db.StringProperty(default=roles.USER)
first_name = db.StringProperty()
last_name = db.StringProperty()
...
session_id = request['session_id']
data = memcache.get(session_id)
user = User.get(data['key'])
我使用memcache保存会话信息。memcache数据看起来像这样{'key':'agpjYW5kaXJhdGVzcgoLEgRVc2VyGCMM'}。我从cookie中获取session\u id
值。当我尝试获取链接到该cookie的用户信息时,如下所示:
class User(db.Model):
email = db.EmailProperty()
role = db.StringProperty(default=roles.USER)
first_name = db.StringProperty()
last_name = db.StringProperty()
...
session_id = request['session_id']
data = memcache.get(session_id)
user = User.get(data['key'])
我得到kinderor
异常:
KindError: Kind 'User' is not a subclass of kind 'User'
我知道这个用户存在,memcache也存在。在我的项目中,用户类只定义了一次。发生此错误的原因以及如何使其工作
更新:我尝试使用db.get()
而不是User.get()
,结果成功了。那么,可能存在什么问题呢?Model.get()
会检查提供的密钥是否为中定义的正确类型。如果类型不正确,它将抛出一个kinderor
db.get()
因此,您需要检查memcache中的密钥实际上是否属于User
类型。你确定它在某个时候没有被其他模型的键覆盖吗?应用程序引擎框架将一个名为“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
,这是明确的。在我看来,问题比这更微妙。我在调用Model.get()时出错(我正在检索一个顶级单例对象,总是在那里):
所以我用这个代码进行了调查:
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))问题似乎出在导入上。在不同的模块中,我使用了不同的导入语句。一个用于lib.utils.profiles导入用户,它工作良好,因为它包含模块的整个路径。另一个是从utils.profiles导入用户中使用的,它引发了一个异常。这些是非常有用的注释。我会根据你的建议更新我的代码。谢谢