13

最新的 App Engine SDK (1.2.1) 有一个 API 调用,用于根据用户的电子邮件地址计算用户帐户的 ID。(即使用户稍后更改地址,该 ID 仍保持不变。)有关信息,请参阅有关唯一、不透明用户 ID的问题。但是,我对此 API 调用有疑问。

user_id()适用于登录用户(即 from users.get_current_user),但它返回构造函数None创建的对象users.User()。** 什么给出?

例如,使用出色的App Engine 控制台,此代码不起作用

>>> import google.appengine.api.users
>>> me = google.appengine.api.users.get_current_user()
>>> me
users.User(email='jason.h.smith@gmail.com',_user_id='105261964646342707921')
>>> me.user_id()
'105261964646342707921'
>>> somebody = google.appengine.api.users.User('someone@gmail.com')
>>> somebody
users.User(email='someone@gmail.com')
>>>somebody.user_id()
>>> type(somebody.user_id())
<type 'NoneType'>

我想要一种将电子邮件地址转换为用户 ID 的简单方法。 如何提前从 Google 强制获取此 ID;或者如果不可能,为什么不呢?

编辑:这是当前的解决方法。

感谢尼克约翰逊的回答。这是他的实际解决方案:

>>> from google.appengine.ext import db
>>> from google.appengine.api import users
>>> class User(db.Model):
...   user = db.UserProperty(required=True)
...
>>> def email_to_userid(address):
...   """Return a stable user_id string based on an email address, or None if
...   the address is not a valid/existing google account."""
...   u = users.User(address)
...   key = User(user=u).put()
...   obj = User.get(key)
...   return obj.user.user_id()
>>> email_to_userid('jason.h.smith@gmail.com')
u'105261964646342707921'
>>> email_to_userid('this@is-an-invalid-email-address')
>>> email_to_userid('this@is-an-invalid-email-address') is None
True
4

2 回答 2

21

当前的解决方法是创建一个用户对象,将其存储到数据存储中,然后再次获取它。如果电子邮件对应于有效的 Google 帐户,则返回实体中的 User 对象将填充其 user_id 字段。

于 2009-05-03T11:02:28.270 回答
1

要使建议的解决方案与 NDB 一起使用,只需将 use_cache=False, use_memcache=False 添加到 get 方法。也就是说: obj = key.get(use_cache=False, use_memcache=False) 这保证了从数据存储中获取实体并填充了 user_id 参数(仅当这是一个有效的 Google 帐户时)。

于 2016-12-05T00:31:17.750 回答