代码之家  ›  专栏  ›  技术社区  ›  JasonSmith

如何根据应用程序引擎中的电子邮件地址确定用户ID?

  •  13
  • JasonSmith  · 技术社区  · 15 年前

    最新的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。 我怎么能提前从谷歌强制这个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
    
    2 回复  |  直到 8 年前
        1
  •  21
  •   Nick Johnson    15 年前

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

        2
  •  1
  •   ACEGL    8 年前

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