2009-06-23 11 views
17

Soy un novato en Google App Engine. Mientras estaba repasando el tutorial, encontré varias cosas que hacemos en php-mysql que no están disponibles en GAE. Por ejemplo, en DataStore, la función de incremento automático no está disponible. También estoy confundido acerca de la gestión de sesiones en GAE. Sobre todo, estoy confundido y no puedo visualizar todo el asunto.Ejemplo simple de administración de usuarios para Google App Engine?

Por favor, avísenme un sistema simple de gestión de usuarios con registro de usuario, inicio de sesión de usuario, cierre de sesión de usuario, sesión (crear, gestionar, destruir) con almacén de datos. También, avísenme dónde puedo obtener ejemplos simples pero efectivos.

Gracias de antemano.

Respuesta

6

Django es su mejor apuesta, con la versión que le indiqué, la autenticación y las sesiones deberían "funcionar" según los documentos de Django. this article da instrucciones simples y ejemplos de cómo proceder desde allí.

Para sesiones de Django, consulte here; para Django auth, here.

+1

Aunque he utilizado Django-en-App Engine, no estaría a favor de ignorar appengines incorporadas auth sobre Django. ¿Alguna razón por la que lo haces? (Sí, uso Django fuera de appengine también) – ironfroggy

+1

La autenticación incorporada de GAE solo admite cuentas de Google y, en particular, no admite el "registro de usuarios", que la pregunta requiere específicamente (es por eso que ni siquiera me molesté en sugerir OpenID esta vez. Las últimas veces que lo hice, los consultadores lo vieron como un ataque al deseo de lidiar con su propio registro de usuario. –

+0

Los usuarios pueden registrarse contra la aplicación específicamente la primera vez que inician sesión con sus credenciales de Google (u OpenID). –

1

No escribe la gestión de usuarios y el registro y todo eso, porque utiliza los propios servicios de autenticación de Google. Todo esto está incluido en la documentación de App Engine.

+2

Entonces, ¿mi usuario tiene que usar el nombre de usuario de Google? ¿No pueden registrarse solo en mi sitio web? Entonces, ¿qué pasará para el registro del usuario? – fireball003

22

que tienden a utilizar mi propio usuario y la sesión de manangement

Para mis manejadores web voy a adjuntar un decorador llamado session y uno llamado authorize. El decorador session adjuntará una sesión a cada solicitud, y el decorador authorize se asegurará de que el usuario esté autorizado.

(Una palabra de advertencia, el decorador autorizar es específico de cómo desarrollo mis aplicaciones, el nombre de usuario es el primer parámetro en la mayoría de las solicitudes).

Así, por ejemplo, un controlador de banda puede verse como:

class UserProfile(webapp.RequestHandler): 
    @session 
    @authorize 
    def get(self, user): 
    # Do some funky stuff 
    # The session is attached to the self object. 
    someObjectAttachedToSession = self.SessionObj.SomeStuff 
    self.response.out.write("hello %s" % user) 

En el código anterior, el decorador session atribuye algunas cosas que necesito sesión basado en las galletas que están presentes en la solicitud. El encabezado authorize se asegurará de que el usuario solo pueda acceder a la página si la sesión es la correcta.

El código decoradores son a continuación:

import functools 
from model import Session 
import logging 

def authorize(redirectTo = "/"): 
    def factory(method): 
     'Ensures that when an auth cookie is presented to the request that is is valid' 
     @functools.wraps(method) 
     def wrapper(self, *args, **kwargs): 

      #Get the session parameters 
      auth_id = self.request.cookies.get('auth_id', '') 
      session_id = self.request.cookies.get('session_id', '') 

      #Check the db for the session 
      session = Session.GetSession(session_id, auth_id)   

      if session is None: 
       self.redirect(redirectTo) 
       return 
      else: 
       if session.settings is None: 
        self.redirect(redirectTo) 
        return 

       username = session.settings.key().name() 

       if len(args) > 0:    
        if username != args[0]: 
         # The user is allowed to view this page. 
         self.redirect(redirectTo) 
         return 

      result = method(self, *args, **kwargs) 

      return result 
     return wrapper 
    return factory 

def session(method): 
    'Ensures that the sessions object (if it exists) is attached to the request.' 
    @functools.wraps(method) 
    def wrapper(self, *args, **kwargs): 

     #Get the session parameters 
     auth_id = self.request.cookies.get('auth_id', '') 
     session_id = self.request.cookies.get('session_id', '') 

     #Check the db for the session 
     session = Session.GetSession(session_id, auth_id)   

     if session is None: 
      session = Session() 
      session.session_id = Session.MakeId() 
      session.auth_token = Session.MakeId() 
      session.put() 

     # Attach the session to the method 
     self.SessionObj = session   

     #Call the handler.   
     result = method(self, *args, **kwargs) 

     self.response.headers.add_header('Set-Cookie', 'auth_id=%s; path=/; HttpOnly' % str(session.auth_token)) 
     self.response.headers.add_header('Set-Cookie', 'session_id=%s; path=/; HttpOnly' % str(session.session_id)) 

     return result 
    return wrapper 

def redirect(method, redirect = "/user/"): 
    'When a known user is logged in redirect them to their home page' 
    @functools.wraps(method) 
    def wrapper(self, *args, **kwargs): 
     try:  
      if self.SessionObj is not None: 
       if self.SessionObj.settings is not None: 
        # Check that the session is correct 
        username = self.SessionObj.settings.key().name() 

        self.redirect(redirect + username) 
        return 
     except: 
      pass 
     return method(self, *args, **kwargs) 
    return wrapper 
+0

¡Muchas gracias! Que tiene sentido. Sin embargo, tengo problemas todo el día si tengo que integrar django solo para la administración de usuarios. Según lo que obtengo, webapp solo admite usuarios de Google y todo tipo de soporte para eso. ¿Alguna ayuda o consejo sobre esto? ¿Puedo simplemente hacer eso sin ir por Django? – fireball003

+1

El código anterior no depende de los usuarios de Google, por lo que pierde un poco de facilidad de desarrollo pero obtiene más control; ninguno de los anteriores requiere Django ... - Toda mi administración de usuarios se realiza sin la API de usuario de Googles (que es para twollo.com, ff.amplifeeder.com etc.). Solo uso Django para la representación de la plantilla en este momento, así que no hay ningún requisito para Django tampoco. – Kinlan

+0

¿esta sigue siendo la forma preferida para la administración de usuarios de un cliente? ¿cómo se implementa el objeto sesión, en particular la función MakeId()? –