Gestione delle sessioni con Firestore

Molte app richiedono la gestione delle sessioni per l'autenticazione e le preferenze dell'utente. Il framework Flask include un'implementazione basata sulla memoria per eseguire questa funzione. Tuttavia, questa implementazione non è adatta per un'app che può essere pubblicata da più istanze, perché la sessione registrata in un'istanza potrebbe essere diversa da altre istanze. Questo tutorial mostra come gestire le sessioni su App Engine.

Obiettivi

  • Scrivi l'app.
  • Esegui l'app localmente.
  • Eseguire il deployment dell'app su App Engine.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.

Prima di iniziare

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Firestore API.

    Enable the API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Firestore API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Installa Python, pip e virtualenv sul tuo sistema. Per le istruzioni, vedi Configurazione di un ambiente di sviluppo Python per Google Cloud.

Configurazione del progetto

  1. Nella finestra del terminale, inizia in una directory a tua scelta e crea una nuova directory denominata sessions. Tutto il codice di questo tutorial è contenuto nella directory sessions.

  2. Passa alla directory sessions:

    cd sessions
    
  3. Crea il requirements.txt con i seguenti contenuti:

    google-cloud-firestore==2.5.1
    flask==2.1.2
    
  4. Installa le dipendenze:

    pip install  -r requirements.txt
    

La struttura finale del file è simile alla seguente alla fine di questo tutorial:

sessions
├── app.yaml
├── main.py
└── requirements.txt

Scrittura dell'app web

Questa app visualizza i saluti in diverse lingue per ogni utente. Gli utenti di ritorno vengono sempre accolti nella stessa lingua.

Diverse finestre dell'app in cui viene visualizzato un annuncio in diverse lingue.

Prima che la tua app possa memorizzare le preferenze per un utente, devi trovare un modo per memorizzare le informazioni relative all'utente corrente in una sessione. Questa app di esempio utilizza cookie e Firestore per archiviare i dati delle sessioni.

  • Nella finestra del terminale, crea un file denominato main.py con il seguente contenuto:

    import random
    from uuid import uuid4
    
    from flask import Flask, make_response, request
    from google.cloud import firestore
    
    app = Flask(__name__)
    db = firestore.Client()
    sessions = db.collection('sessions')
    greetings = [
        'Hello World',
        'Hallo Welt',
        'Ciao Mondo',
        'Salut le Monde',
        'Hola Mundo',
    ]
    
    @firestore.transactional
    def get_session_data(transaction, session_id):
        """ Looks up (or creates) the session with the given session_id.
            Creates a random session_id if none is provided. Increments
            the number of views in this session. Updates are done in a
            transaction to make sure no saved increments are overwritten.
        """
        if session_id is None:
            session_id = str(uuid4())   # Random, unique identifier
    
        doc_ref = sessions.document(document_id=session_id)
        doc = doc_ref.get(transaction=transaction)
        if doc.exists:
            session = doc.to_dict()
        else:
            session = {
                'greeting': random.choice(greetings),
                'views': 0
            }
    
        session['views'] += 1   # This counts as a view
        transaction.set(doc_ref, session)
    
        session['session_id'] = session_id
        return session
    
    @app.route('/', methods=['GET'])
    def home():
        template = '<body>{} views for "{}"</body>'
    
        transaction = db.transaction()
        session = get_session_data(transaction, request.cookies.get('session_id'))
    
        resp = make_response(template.format(
            session['views'],
            session['greeting']
            )
        )
        resp.set_cookie('session_id', session['session_id'], httponly=True)
        return resp
    
    if __name__ == '__main__':
        app.run(host='127.0.0.1', port=8080)
  • Il seguente diagramma illustra in che modo Firestore gestisce le sessioni dell'app App Engine.

    Diagramma dell'architettura: utente, App Engine, Firestore.

Eliminazione di sessioni

Puoi eliminare i dati della sessione o implementare una strategia di eliminazione automatica. Se utilizzi soluzioni di archiviazione per sessioni come Memcache o Redis, le sessioni scadute vengono eliminate automaticamente.

Esecuzione in locale

  1. Nella finestra del terminale, installa il server HTTP Gunicorn:

    pip install gunicorn
    
  2. Esegui il Gunicorn HTTP server:

    gunicorn -b :8080 main:app
    
  3. Visualizza l'app nel browser web:

    Cloud Shell

    Nella barra degli strumenti di Cloud Shell, fai clic su Anteprima web Anteprima web e seleziona Anteprima sulla porta 8080.

    Computer locale

    Nel browser, vai a http://localhost:8080

    Vedrai uno dei cinque saluti: "Hello World". La lingua cambia se apri la pagina in un altro browser o in modalità di navigazione in incognito. Puoi visualizzare e modificare i dati della sessione in Google Cloud Console.

    Sessioni Firestore in Cloud Console.

  4. Per interrompere il server HTTP, premi Control+C nella finestra del terminale.

Deployment ed esecuzione in App Engine

Puoi utilizzare l'ambiente standard di App Engine per creare ed eseguire il deployment di un'app che può essere eseguita in modo affidabile con un carico elevato e con grandi quantità di dati.

Questo tutorial utilizza l'ambiente standard di App Engine per il deployment del server.

  1. Nella finestra del terminale, crea un file app.yaml e copia quanto segue:

    runtime: python37
  2. Esegui il deployment dell'app su App Engine:

    gcloud app deploy
    
  3. Visualizza l'app pubblicata all'indirizzo https://your-project-id.appspot.com:

    gcloud app browse
    

    Dove your-project-id è il tuo ID progetto Google Cloud.

L'annuncio viene ora recapitato da un server web in esecuzione su un'istanza App Engine.

Esecuzione del debug dell'app

Se non riesci a connetterti all'app App Engine, verifica quanto segue:

  1. Controlla che i comandi di deployment di gcloud siano stati completati correttamente e che non abbiano restituito errori. Se si sono verificati errori (ad esempio message=Build failed), correggili e prova a eseguire nuovamente il deployment dell'app App Engine.
  2. In Cloud Console, vai alla pagina Esplora log.

    Vai alla pagina Esplora log

    1. Nell'elenco a discesa Risorse selezionate di recente, fai clic su Applicazione App Engine, quindi su Tutti module_id. Viene visualizzato un elenco di richieste a partire dal momento in cui hai visitato la tua app. Se non vedi un elenco di richieste, verifica di aver selezionato All module_id dall'elenco a discesa. Se vengono visualizzati messaggi di errore stampati in Cloud Console, verifica che il codice dell'app corrisponda al codice della sezione relativa alla scrittura dell'app web.

    2. Assicurati che l'API Firestore sia abilitata.

Esegui la pulizia

Elimina il progetto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Elimina l'istanza App Engine

  1. In the Google Cloud console, go to the Versions page for App Engine.

    Go to Versions

  2. Select the checkbox for the non-default app version that you want to delete.
  3. Per eliminare la versione dell'app, fai clic su Elimina.

Passaggi successivi