User 对象

User 类的实例代表用户。User 实例是唯一的,并且是可比较的。如果两个实例相同,那么这两个实例代表同一用户。

应用可以通过调用 users.get_current_user() 函数来访问当前用户对应的 User 实例。

user = users.get_current_user()

无论您的应用使用哪种身份验证选项,您都可以使用 users.get_current_user() 函数。

也可利用电子邮件地址构造 User 实例。

user = users.User("Albert.Johnson@example.com")

或者,如果您有 federated_identity,则可以使用它来创建 User 实例:

user = users.User(federated_identity="http://example.com/id/ajohnson")

如果使用与有效 Google 账号不对应的电子邮件地址调用 User 构造函数,则会创建对象,但该对象与实际的 Google 账号不对应。 即使有人在存储了该对象后用指定的电子邮件地址创建了 Google 账号,也将出现这种情况。如果创建 User 值时使用的电子邮件地址当时不代表 Google 账号,该 User 值将永远不会与代表真实用户的 User 值相匹配。

当在开发 Web 服务器下运行时,所有 User 对象在存储于(模拟)Datastore 中时都假定代表有效的 Google 账号。

有效用户的 User 对象可以为该用户提供唯一的 ID 值,即使该用户更改了其电子邮件地址,该 ID 值也保持不变。user_id() 方法会返回此 ID,这是一个 str 值。

无论您的应用使用哪种身份验证方法,User 对象均采用相同的形式。

将 User 值与 Datastore 配合使用

用户 ID 是稳定的;您可以在键名或字符串属性中使用。 因此,当使用用户值时,您需要存储用户 ID(或许是最后一次看到的邮件地址,以便通过邮件与用户通信)。以下示例展示了如何将当前用户与用户 ID 进行比较:

class ModelWithUser(ndb.Model):
    user_id = ndb.StringProperty()
    color = ndb.StringProperty()

    @classmethod
    def get_by_user(cls, user):
        return cls.query().filter(cls.user_id == user.user_id()).get()

我们强烈建议您不要存储 UserProperty,因为它包含电子邮件地址以及用户的唯一 ID。如果用户更改了其电子邮件地址,当您将其存储的旧 User 与新 User 值进行比较时,它们将无法匹配。请改为考虑将 User 用户 ID 值用作用户的固定唯一标识符。