如何在GAE中获取或创建用户配置文件?

时间:2012-03-19 20:31:34

标签: google-app-engine

我有个人资料模型:

class Profile(db.Model):
    user = db.UserProperty(auto_current_user=True)
    bio = db.StringProperty()

我想在此视图中显示用户现有的bio。如果用户还没有个人资料,我想创建它。这是我到目前为止所做的,但尚未奏效:

class BioPage(webapp2.RequestHandler):
    def get(self):
        user = users.get_current_user()
        if user:
            profile = Profile.get_or_insert(user=user) #This line is wrong
            profile.bio = "No bio entered yet."
            profile.save()
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.out.write('Hello, ' + user.nickname() + '<br/>Bio: ' + profile.bio)
        else:
            self.redirect(users.create_login_url(self.request.uri))

如何修复上面的错误行?我知道get_or_insert()应该采用一个关键名称,但我无法弄清楚它会是什么。

(Profile中的用户字段是否应该是db.UserProperty?)

2 个答案:

答案 0 :(得分:2)

在这种情况下,您必须将key_name传递给get_or_insert(),如下所示:

profile = Profile.get_or_insert(key_name=user.email())

请注意,由于user会自动填充auto_current_user=True属性,因此您无需将其传递给get_or_insert()。在您的情况下,除了键名之外,您不需要传递任何内容。

答案 1 :(得分:1)

您可能不想使用db.UserProperty,原因如here所述。总之,如果用户更改了他/她的电子邮件地址,您(旧)存储的“用户”将不会与当前登录的(新)“用户”进行比较。

相反,将user.user_id()存储为Profile模型上的StringProperty(如上面引用的页面所示),或者作为Profile模型的键(key_name)。后者的一个例子是here