数据存储。未找到对象属性,尽管它存在于数据存储区中
Datastore. Object attribute not found although it exists in the Datastore
当代码检查用户是否可以执行操作时,未找到 ndb.BooleanProperty(default=False) 属性。
我试过使用 ndb.StringProperty 而不是布尔值 属性,但这没有区别。 属性 中的其他属性被识别。
最有趣的是,如果我在 jinja2 中的 HTML 中放置一个 {{user.org_setup_done}} 标签,它 returns 正确的属性值,即 False。
换句话说,我知道该属性已正确创建并存储在用户实体中,因为我可以在数据存储中看到它并在 HTML 中使用 jinja2 标记调用它。但是,当我对其进行检查时,却找不到它。
class User(ndb.Model):
"""
model for storing user information
"""
email = ndb.StringProperty(required=True) # the users email, as username
pass_hash = ndb.StringProperty(required=True) # the users hashed password
org_setup_done = ndb.BooleanProperty(default=False) # if the user has completed the org profile for creating events
class OrgCreateCompStartHandler(BaseHandler):
"""handler that lets you start creating an event by choosing series, date, name, start time and venue"""
def get(self):
try:
user = self.user_obj() # get the user object from session, returns None if no session exists
if user.org_setup_done: # check to see if the user is org_ready. If yes, continue with the event creation,
# if no then redirect to the profile page for event organisers.
# : TEMPLATE VALUES
template_values = {
'user': user,
}
# : RENDER TEMPLATE
self.render_template(ROUTE, 'org-create.html', template_values)
else:
self.redirect("/")
except Exception, e:
logging.error("ERROR is %s" % e)
logging.exception("EXC is %s" % e)
self.redirect("/oops") # unexpected error
预期结果应为 org-create.html 页面,在代码检查 org_setup_done 属性为 True 后呈现。
实际结果是以下错误:
Traceback (most recent call last):
File "C:\Users\events.py", line 2433, in get
if user.org_setup_done:
AttributeError: 'User' object has no attribute 'org_setup_done'
有没有人对此有任何想法?我真的被这个弄糊涂了。
user = self.user_obj() # get the user object from session, returns None if no session exists
我认为您的 User
模型与 webapp2
的内置 User
模型冲突
您可以配置 webapp2 以使用您的 User
模型
webapp_app = webapp2.WSGIApplication(
config={
...
'webapp2_extras.auth': {'user_model': 'path.to.my.user_model_file.User'},
})
但是 webapp2
的会话代码可能对 User
对象具有哪些字段/功能有一些假设,因此您需要在 User
中实现这些。
您也可以让您的用户模型继承 webapp2 one
from webapp2_extras.appengine.auth.models import User as _webapp2_User
class User(_webapp2_User):
...
根据@Alex,webapp2 的内置用户模型和我创建的用户模型之间似乎存在冲突。
尽管我也不确定问题是否真的出在 webapp2 的会话代码和我以管理员身份登录时创建的自己的会话代码之间。
即由于该网站尚未上线,它在 app.yaml 文件中以管理员身份 google 登录。一旦我在开发服务器上登录,webapp2 就会创建一个会话 cookie。然后,当我为该站点创建一个新用户时,将创建另一个会话 cookie,这次是通过我的 BaseHandler 在调度中创建的。我对代码的了解不足以知道冲突是否真的存在于这 2 个会话 cookie 中,但也许是。
当代码检查用户是否可以执行操作时,未找到 ndb.BooleanProperty(default=False) 属性。
我试过使用 ndb.StringProperty 而不是布尔值 属性,但这没有区别。 属性 中的其他属性被识别。 最有趣的是,如果我在 jinja2 中的 HTML 中放置一个 {{user.org_setup_done}} 标签,它 returns 正确的属性值,即 False。
换句话说,我知道该属性已正确创建并存储在用户实体中,因为我可以在数据存储中看到它并在 HTML 中使用 jinja2 标记调用它。但是,当我对其进行检查时,却找不到它。
class User(ndb.Model):
"""
model for storing user information
"""
email = ndb.StringProperty(required=True) # the users email, as username
pass_hash = ndb.StringProperty(required=True) # the users hashed password
org_setup_done = ndb.BooleanProperty(default=False) # if the user has completed the org profile for creating events
class OrgCreateCompStartHandler(BaseHandler):
"""handler that lets you start creating an event by choosing series, date, name, start time and venue"""
def get(self):
try:
user = self.user_obj() # get the user object from session, returns None if no session exists
if user.org_setup_done: # check to see if the user is org_ready. If yes, continue with the event creation,
# if no then redirect to the profile page for event organisers.
# : TEMPLATE VALUES
template_values = {
'user': user,
}
# : RENDER TEMPLATE
self.render_template(ROUTE, 'org-create.html', template_values)
else:
self.redirect("/")
except Exception, e:
logging.error("ERROR is %s" % e)
logging.exception("EXC is %s" % e)
self.redirect("/oops") # unexpected error
预期结果应为 org-create.html 页面,在代码检查 org_setup_done 属性为 True 后呈现。
实际结果是以下错误:
Traceback (most recent call last):
File "C:\Users\events.py", line 2433, in get
if user.org_setup_done:
AttributeError: 'User' object has no attribute 'org_setup_done'
有没有人对此有任何想法?我真的被这个弄糊涂了。
user = self.user_obj() # get the user object from session, returns None if no session exists
我认为您的 User
模型与 webapp2
User
模型冲突
您可以配置 webapp2 以使用您的 User
模型
webapp_app = webapp2.WSGIApplication(
config={
...
'webapp2_extras.auth': {'user_model': 'path.to.my.user_model_file.User'},
})
但是 webapp2
的会话代码可能对 User
对象具有哪些字段/功能有一些假设,因此您需要在 User
中实现这些。
您也可以让您的用户模型继承 webapp2 one
from webapp2_extras.appengine.auth.models import User as _webapp2_User
class User(_webapp2_User):
...
根据@Alex,webapp2 的内置用户模型和我创建的用户模型之间似乎存在冲突。
尽管我也不确定问题是否真的出在 webapp2 的会话代码和我以管理员身份登录时创建的自己的会话代码之间。
即由于该网站尚未上线,它在 app.yaml 文件中以管理员身份 google 登录。一旦我在开发服务器上登录,webapp2 就会创建一个会话 cookie。然后,当我为该站点创建一个新用户时,将创建另一个会话 cookie,这次是通过我的 BaseHandler 在调度中创建的。我对代码的了解不足以知道冲突是否真的存在于这 2 个会话 cookie 中,但也许是。