¿Cómo puedo determinar un ID de usuario basado en una dirección de correo electrónico en App Engine?

El SDK de App Engine más reciente (1.2.1) tiene una llamada API para calcular una ID para una cuenta de usuario basada en su dirección de correo electrónico. (La ID sigue siendo la misma, incluso si el usuario cambia su dirección más adelante). Consulte esta pregunta sobre ID de usuario opacos únicos para información. Sin embargo, tengo un problema con esta llamada a la API.

user_id() funciona para usuarios registrados (es decir, desdeusers.get_current_user), pero devuelveNone para objetos creados porusers.User() constructor. ** ¿Qué da?

Por ejemplo, usando la excelenteApp Engine Console, este códigoNo funcion.

>>> 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'>

Quiero una forma sencilla de convertir una dirección de correo electrónico a una ID de usuario. @ ¿Cómo puedo forzar esta identificación de Google con anticipación? o si no es posible, ¿por qué no?

Edit: Aquí está la solución actual.

Gracias a Nick Johnson por su respuesta. Aquí está su solución en acción:

>>> 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('this@is-an-invalid-email-address')
>>> email_to_userid('this@is-an-invalid-email-address') is None
True

Respuestas a la pregunta(2)

Su respuesta a la pregunta