Tiene razón, debe crear su propio modelo de usuario y almacenar la información adicional y la lógica de negocios que tenga en su aplicación. Todo lo que tiene que hacer es almacenar algo único (federated_id
por ejemplo) junto con el extra username
, name
, etc.
Después de acceder con el OpenID, se comprueba si esa particular federated_id
es en su almacén de datos y usted será devuelva ese particular user_db
, o cree uno nuevo con los valores predeterminados y devuelva el user_db
recién creado.
Lo importante es que en sus solicitudes siempre se ocupará de su propia entidad user_db
y no del users.get_current_user()
porque esto es básicamente de solo lectura y limitado.
Aquí es un ejemplo completo, que también demuestra un base handler class con la función get_user()
que devolverá su propio user_db
entidad si el usuario está conectado y None
lo contrario. Si el usuario va a iniciar sesión por primera vez, una nueva entidad USER_DB se crea con algunos valores por defecto (name
, username
, email
, admin
, federated_id
):
from google.appengine.api import users
from google.appengine.ext import ndb
import webapp2
class User(ndb.Model):
name = ndb.StringProperty(required=True)
username = ndb.StringProperty(required=True)
email = ndb.StringProperty()
federated_id = ndb.StringProperty()
admin = ndb.BooleanProperty()
class BaseHandler(webapp2.RequestHandler):
def get_user_db(self):
federated_user = users.get_current_user()
if not federated_user:
return None
user_db_qry = User.query(User.federated_id == federated_user.user_id())
user_db_list = user_db_qry.fetch(1)
#If that returns non empty list, then return the first element which is the user_db
if user_db_list:
return user_db_list[0]
#Otherwise create a new user_db entity, with default values and return
user_db = User(
name=federated_user.nickname().title(),
username=federated_user.nickname(),
email=federated_user.email(),
federated_id=federated_user.user_id(),
admin=users.is_current_user_admin(),
)
user_db.put()
return user_db
class MainHandler(BaseHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/html'
if self.get_user_db():
self.response.out.write('Hello, %s!</br>' % self.get_user_db().name)
self.response.out.write('<a href="%s">Logout</a>' % (users.create_logout_url(self.request.uri)))
else:
self.response.out.write('Hello, stranger!<br>')
self.response.out.write('<a href="%s">Login</a>' % (users.create_login_url(self.request.uri)))
app = webapp2.WSGIApplication([('/', MainHandler)],
debug=True)
Hay muchos enfoques diferentes para este problema, pero creo que este es un buen comienzo para entender la idea.
bueno, gracias Lo probaré esta tarde y veré cómo va – clifgray
podría explicar lo que está haciendo esta línea: user_db_list = User.query (User.federated_id == usuario_de_usuario.user_id()) fetch (1) – clifgray
@clifgray esa línea está recuperando de su propio modelo el usuario que tiene para un federated_id específico ... si el resultado no es una lista vacía, entonces tenemos un ganador .. otherwiser tenemos que crear una entidad y luego devolverla .. – Lipis