2009-06-23 10 views
17

Sono novizio in Google App Engine. Mentre stavo seguendo il tutorial, ho scoperto che molte cose che facciamo in php-mysql non sono disponibili in GAE. Ad esempio in dataStore la funzione di incremento automatico non è disponibile. Inoltre sono confuso riguardo la gestione delle sessioni in GAE. Più di tutto sono confuso e non riesco a visualizzare il tutto.Semplice esempio di gestione degli utenti per Google App Engine?

Vi prego di consigliare un sistema di gestione utente semplice con la registrazione degli utenti, login utente, logout utente, sessione (creare, gestire, distruggere) con archivio dati. Inoltre, ti prego di avvisarmi dove posso ottenere esempi semplici ma efficaci.

Grazie in anticipo.

risposta

6

Django è la soluzione migliore: con la versione a cui ti ho indirizzato, auth e sessioni dovrebbero entrambi "funzionare" come per i documenti Django. this article fornisce semplici istruzioni ed esempi su come procedere da lì.

Per le sessioni di Django, vedere here; per l'autenticazione Django, here.

+1

Anche se ho usato Django-on-AppEngine, non vorrei sostenere ignorando appengines built autenticazione su Django. Qualche ragione che fai? (Sì, uso Django anche al di fuori di Appengine) – ironfroggy

+1

"Builtin auth" di GAE supporta solo account Google, in particolare non supporta la "registrazione utente", che la domanda richiede in modo specifico (è anche per questo che non mi sono nemmeno preoccupato di suggerire OpenID questa volta - le ultime volte che ho fatto gli askers l'ho visto apparentemente come un attacco al loro desiderio di gestire la propria registrazione utente! -). –

+0

Gli utenti possono registrarsi contro l'app in particolare la prima volta che effettuano l'accesso con le proprie credenziali Google (o OpenId). –

1

Non si scrive la gestione e la registrazione degli utenti e tutto il resto, perché si utilizzano i servizi di autenticazione di Google. Questo è tutto incluso nella documentazione di App Engine.

+2

Quindi, il mio utente deve utilizzare il nome utente Google? Non possono registrarsi solo nel mio sito web? Quindi, cosa accadrà per la registrazione dell'utente? – fireball003

22

tendo a usare il mio utente e sessione manangement

Per i miei gestori di web io collegare un decoratore chiamato session e uno chiamato authorize. Il decoratore session allegherà una sessione a ogni richiesta e il decoratore authorize si assicurerà che l'utente sia autorizzato.

(Una parola di cautela, decoratore autorizzare è specifico per come ho sviluppare le mie applicazioni - il nome utente è il primo parametro nella maggior parte delle richieste).

Così, per esempio un gestore di rete può essere simile:

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) 

Nel codice precedente, il decoratore session attribuisce alcune cose sessione che ho bisogno in base ai cookie che sono presenti in merito alla richiesta. L'intestazione authorize si accerterà che l'utente possa accedere alla pagina solo se la sessione è quella corretta.

Il codice decoratori sono al di sotto:

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

Grazie mille! Ha senso. Tuttavia sono turbato tutto il giorno se dovrò integrare django solo per la gestione degli utenti. Per quanto ho capito, webapp supporta solo utenti google e ogni sorta di supporto per questo. Qualche aiuto o consiglio su questo? Posso farlo semplicemente senza andare a Django? – fireball003

+1

Il codice di cui sopra non dipende dagli utenti di Google, quindi perdi un po 'di facilità di sviluppo ma ottieni un maggiore controllo - nessuno dei precedenti richiede Django ... - Tutta la mia gestione degli utenti viene eseguita senza l'API utente di Google (ovvero per twollo.com, ff.amplifeeder.com ecc.). Io uso Django per il rendering dei modelli al momento, quindi non c'è nemmeno bisogno di Django. – Kinlan

+0

è ancora il modo preferito per la gestione degli utenti del cliente? come è implementato l'oggetto Session, in particolare la funzione MakeId()? –