如何根据App Engine中的电子邮件地址确定user_id?

时间:2009-05-03 05:02:54

标签: google-app-engine email user-identification

最新的App Engine SDK(1.2.1)具有API调用,可根据用户帐户的电子邮件地址计算用户帐户的ID。 (即使用户稍后更改了地址,ID仍保持不变。)有关信息,请参阅此question about unique, opaque user IDs。但是,我对此API调用有疑问。

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

例如,使用优秀的App Engine Console,此代码无效

>>> 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?或者如果不可能,为什么不呢?

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

感谢Nick Johnson的回答。以下是他的解决方案:

>>> 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

1 个答案:

答案 0 :(得分:21)

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