【问题标题】:Datastore. Object attribute not found although it exists in the Datastore数据存储。尽管对象属性存在于数据存储中,但未找到它
【发布时间】:2019-12-30 15:51:51
【问题描述】:

当代码检查用户是否可以执行某项操作时,找不到 ndb.BooleanProperty(default=False) 属性。

我尝试使用 ndb.StringProperty 而不是 Boolean 属性,但没有区别。财产中的其他属性得到认可。 最有趣的是,如果我在 HTML 中的 jinja2 中放置一个 {{user.org_setup_done}} 标记,它会正确返回属性的值,即 False。

换句话说,我知道该属性已正确创建并存储在 User 实体中,因为我可以在数据存储中看到它并在 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_setup_done 属性为 True 后呈现 org-create.html 页面。

实际结果如下错误:

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'

有人对此有任何想法吗?我真的被这个弄糊涂了。

【问题讨论】:

  • 在添加org_setup_done 属性或将其默认值添加到模型中之前,您是否有创建了任何用户对象?
  • @DanCornilescu 谢谢。我已经删除了之前创建的用户并刷新了 memchache 以确保这不是问题。我将属性的名称更改为完全任意的名称,并将其设为字符串而不是布尔值,并删除了默认值,改为硬编码“False”。我仍然有同样的错误信息。找到其他属性,即电子邮件,如果呈现 org-create.html 模板,则 {{ user.email }} 正确返回值,而 {{ user.arbitrary value }} 未找到。我已经看了将近 2 天了,不知道如何解决这个问题!

标签: python google-app-engine google-cloud-datastore app-engine-ndb


【解决方案1】:
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 一个

from webapp2_extras.appengine.auth.models import User as _webapp2_User

class User(_webapp2_User):
    ...

【讨论】:

  • 谢谢,虽然我不确定。我在之前的一个简单项目中使用了一个名为 User 的模型,并且没有类似的问题。我将尝试更改模型名称(尽管会导致实时版本出现问题)并查看它是否有效。干杯。
  • 发生冲突,我将 User 模型名称更改为 Users,它按预期工作。
【解决方案2】:

根据@Alex,webapp2 的内置用户模型和我创建的用户模型之间似乎存在冲突。

虽然我也不确定问题是否真的在来自 webapp2 的会话代码和我以管理员身份登录时创建的我自己的会话代码之间。

即由于该站点尚未上线,因此它在 app.yaml 文件中以管理员身份登录谷歌。一旦我在开发服务器上登录,webapp2 就会创建一个会话 cookie。然后,当我为站点创建新用户时,会创建另一个会话 cookie,这次是通过调度中的 BaseHandler。我对代码的了解不足以知道冲突是否真的在于这 2 个会话 cookie,但也许确实如此。

【讨论】:

    猜你喜欢
    • 2015-06-15
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多