В новейшем SDK App Engine (1.2.1) есть вызов API для вычисления идентификатора учетной записи пользователя на основе его адреса электронной почты. (Идентификатор остается прежним, даже если пользователь изменяет свой адрес позже.) См. Этот вопрос об уникальных непрозрачных идентификаторах пользователя для получения информации. Однако у меня проблема с этим вызовом API.
user_id()
работает для вошедших в систему пользователей (то есть с 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'>
Я хочу простой способ преобразования адреса электронной почты в идентификатор пользователя. Как я могу получить этот идентификатор от Google заранее; или если это невозможно, то почему бы и нет?
Редактировать: вот текущее решение.
Спасибо Нику Джонсону за ответ. Вот его решение в действии:
>>> 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