2012-06-25 16 views
5

Así que estoy escribiendo una aplicación en python para google appengine en la plataforma de plantillas jinja2. He obtenido OpenID para que funcione perfectamente en mi sitio y permite al usuario iniciar sesión y puedo mostrar su dirección de correo electrónico/ID en la esquina superior derecha.da a los usuarios de OpenID información adicional

Ahora quiero que los usuarios tengan sus propios nombres de usuario y poder almacenar algunos datos adicionales sobre ellos, como visitas al sitio y ciertas publicaciones en áreas del sitio.

Sé que necesito crear una tabla en la base de datos con usuarios y todo, pero cuál es la forma correcta de hacerlo con OpenID. Quiero crear automáticamente al usuario cuando alguien inicia sesión por primera vez, pero no estoy muy seguro de cómo hacerlo de manera eficiente. Creo que puedo gestionarlo redirigiéndolos a una página después del inicio de sesión que comprueba su federated_identity en una base de datos y, si ya existe, simplemente los redirecciona a la página de inicio, pero si no crea un nuevo usuario.

¿Hay una manera más eficiente para que no consulte la base de datos cada vez que alguien inicia sesión o es una forma bastante decente de hacerlo?

Respuesta

6

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.

+0

bueno, gracias Lo probaré esta tarde y veré cómo va – clifgray

+0

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

+0

@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

Cuestiones relacionadas