Как определить идентификатор_пользователя на основе адреса электронной почты в App Engine? - PullRequest
13 голосов
/ 03 мая 2009

В новейшем 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

Ответы [ 2 ]

21 голосов
/ 03 мая 2009

Текущий обходной путь - создать объект User, сохранить его в хранилище данных и извлечь его снова. Если электронная почта соответствует действительной учетной записи Google, у объекта User в возвращенном объекте будет заполнено поле user_id.

1 голос
/ 05 декабря 2016

Чтобы предложенное решение работало с NDB, просто добавьте use_cache = False, use_memcache = False в метод get. То есть: obj = key.get(use_cache=False, use_memcache=False) Это гарантирует получение объекта из хранилища данных с заполненным параметром user_id (только если это действительный аккаунт Google).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...