最新的App Engine SDK(1.2.1)有一个API调用,可以根据用户的电子邮件地址计算用户帐户的ID。(即使用户以后更改其地址,ID仍然保持不变。)有关信息,请参见关于唯一、不透明用户ID的问题。但是,我对这个API调用有一个问题。
例如,使用优秀的App Engine Console,这段代码无法正常工作。
我希望有一种简单的方法将电子邮件地址转换为用户ID。如何在提前从Google获取此ID;如果不可能,为什么不行?
编辑:这是目前的解决方法。
感谢Nick Johnson的回答。这是他的解决方案的实现:
user_id()
适用于已登录的用户(即来自users.get_current_user
),但对于由users.User()
构造函数创建的对象,它返回None
。**怎么回事?例如,使用优秀的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
ndb
,因为ndb
对象被缓存在 memcache 中,所以您使用.get
获取的对象并不来自数据存储。 - mgilson