My favorites | 中文(简体) | Sign in

User 对象

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

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

from google.appengine.api import users

user = users.get_current_user()
if not user:
  # The user is not signed in.
else:
  print "Hello, %s!" % user.nickname()

也可从电子邮件地址中构造 User 实例。

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

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

当在开发网络服务器下运行时,所有 User 对象在存储于(模拟)数据库中时都假定代表有效的 Google 帐户。

将 User 值与数据库配合使用

User 实例可以是数据库属性值。

class UserPrefs(db.Model):
  user = db.UserProperty()

user = users.get_current_user()
if user:
  q = db.GqlQuery("SELECT * FROM UserPrefs WHERE user = :1", user)
  userprefs = q.get()

注意:此时,用户 API 不为 Google 帐户提供永久性的唯一标识符。虽然一个电子邮件地址在某指定时刻是某个帐户所特有的,但用户可随时更改该帐户的电子邮件地址。对电子邮件地址的更改不会自动传播到数据库 User 值。在以后的版本中可实现唯一用户 ID 与电子邮件地址的更改传播。在这些功能中的任一功能得以实现之前,没有好方法可以在电子邮件地址发生更改后将当前用户与该用户的偏好数据相关联。

避免在数据库实体键名中使用用户的电子邮件地址。如果您的应用程序存储了用户偏好数据,请考虑使用 User 属性和查询来检索数据。在实现传播功能之后,此项技术将对电子邮件地址更改自动生效。这并不能防止意外创建多个使用偏好对象(该操作将需要一个可计算的键名和一个事务),但查询由于排序的原因始终会返回正确的结果。