Ответ 1
Текущее обходное решение - создать объект User, сохранить его в хранилище данных и извлечь его снова. Если письмо соответствует действительной учетной записи Google, объект User в возвращаемом объекте будет иметь заполненное поле user_id.
В новейшем SDK приложения App Engine (1.2.1) есть вызов API для вычисления идентификатора учетной записи пользователя на основе его адреса электронной почты. (Идентификатор остается прежним, даже если пользователь меняет свой адрес позже.) См. Этот вопрос об уникальных непрозрачных идентификаторах пользователя. Однако у меня есть проблема с этим вызовом 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='[email protected]',_user_id='105261964646342707921')
>>> me.user_id()
'105261964646342707921'
>>> somebody = google.appengine.api.users.User('[email protected]')
>>> somebody
users.User(email='[email protected]')
>>>somebody.user_id()
>>> type(somebody.user_id())
<type 'NoneType'>
Я хочу простой способ конвертировать адрес электронной почты в ID пользователя. Как я могу принудить этот идентификатор от 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('[email protected]')
u'105261964646342707921'
>>> email_to_userid('[email protected]')
>>> email_to_userid('[email protected]') is None
True
Текущее обходное решение - создать объект User, сохранить его в хранилище данных и извлечь его снова. Если письмо соответствует действительной учетной записи Google, объект User в возвращаемом объекте будет иметь заполненное поле user_id.
Чтобы предлагаемое решение работало с NDB, просто добавьте use_cache = False, use_memcache = False к методу get. То есть:
obj = key.get(use_cache=False, use_memcache=False)
Это гарантирует получение объекта из хранилища данных с заполняемым параметром user_id (только если это действительная учетная запись Google).