数据存储。未找到对象属性,尽管它存在于数据存储区中

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 中,但也许是。