Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 谷歌应用引擎中的KindError_Python_Google App Engine - Fatal编程技术网

Python 谷歌应用引擎中的KindError

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

我在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']
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导入用户中使用的,它引发了一个异常。这些是非常有用的注释。我会根据你的建议更新我的代码。谢谢