Personalizzare i dati per gli utenti autenticati

ID regione

REGION_ID è un codice abbreviato assegnato da Google in base alla regione selezionata quando crei l'app. Il codice non corrisponde a un paese o a una provincia, anche se alcuni ID regione possono sembrare simili ai codici di paesi e province di uso comune. Per le app create dopo febbraio 2020, REGION_ID.r è incluso negli URL di App Engine. Per le app esistenti create prima di questa data, l'ID regione è facoltativo nell'URL.

Scopri di più sugli ID regione.

Utilizza le informazioni degli utenti autenticati per archiviare e recuperare dati specifici degli utenti e personalizzare l'esperienza di ciascun utente con il tuo servizio web.

In un passaggio precedente, hai aggiornato il servizio web in modo da visualizzare le ultime dieci richieste di tutti gli utenti. In questo passaggio, utilizzi le informazioni dell'utente autenticato per aggiornare il tuo web service in modo che la pagina mostri solo un elenco delle ultime dieci richieste effettuate dall'utente attualmente autenticato.

Prima di iniziare

Se hai completato tutti i passaggi precedenti di questa guida, salta questa sezione. In caso contrario, completa una delle seguenti operazioni:

Archiviare e recuperare dati specifici per l'utente

Puoi indicare che i dati sono collegati a un determinato utente utilizzando gli elementi principali di Firestore in modalità Datastore (Datastore), che ti consentono di organizzare i dati di Datastore in modo gerarchico.

A tale scopo, completa i seguenti passaggi:

  1. Aggiorna i metodi store_time e fetch_time per utilizzare gli antenati di Datastore per archiviare e recuperare le entità visit:

    datastore_client = datastore.Client()
    
    def store_time(email, dt):
        entity = datastore.Entity(key=datastore_client.key("User", email, "visit"))
        entity.update({"timestamp": dt})
    
        datastore_client.put(entity)
    
    
    def fetch_times(email, limit):
        ancestor = datastore_client.key("User", email)
        query = datastore_client.query(kind="visit", ancestor=ancestor)
        query.order = ["-timestamp"]
    
        times = query.fetch(limit=limit)
    
        return times
    
    

    Ora ogni entità visit ha un antenato a cui è collegata. Questi antenati sono entità Datastore che rappresentano singoli utenti autenticati. La chiave di ogni predecessore include il tipo User e un ID personalizzato, ovvero l'indirizzo email dell'utente autenticato. Utilizza la chiave dell'antenato per eseguire query sul database solo per i periodi di tempo associati a un utente specifico.

  2. Aggiorna la chiamata al metodo store_times nel metodo root e spostala all'interno della condizione id_token in modo che venga eseguita solo se il server ha autenticato un utente:

    @app.route("/")
    def root():
        # Verify Firebase auth.
        id_token = request.cookies.get("token")
        error_message = None
        claims = None
        times = None
    
        if id_token:
            try:
                # Verify the token against the Firebase Auth API. This example
                # verifies the token on each page load. For improved performance,
                # some applications may wish to cache results in an encrypted
                # session store (see for instance
                # http://flask.pocoo.org/docs/1.0/quickstart/#sessions).
                claims = google.oauth2.id_token.verify_firebase_token(
                    id_token, firebase_request_adapter
                )
    
                store_time(claims["email"], datetime.datetime.now(tz=datetime.timezone.utc))
                times = fetch_times(claims["email"], 10)
    
            except ValueError as exc:
                # This will be raised if the token is expired or any other
                # verification checks fail.
                error_message = str(exc)
    
        return render_template(
            "index.html", user_data=claims, error_message=error_message, times=times
        )
    
    

Configurazione degli indici

Datastore esegue query in base agli indici. Per le entità semplici, Datastore genera automaticamente questi indici. Tuttavia, non può generare automaticamente indici per entità più complesse, incluse quelle con predecessori. Per questo motivo, devi creare manualmente un indice per le entità visit in modo che Datastore possa eseguire query che coinvolgono le entità visit.

Per creare un indice per le entità visit:

  1. Crea un file index.yaml nella directory principale del progetto, ad esempio building-an-app, e aggiungi il seguente indice:

    # Copyright 2021 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    indexes:
    
    - kind: visit
      ancestor: yes
      properties:
      - name: timestamp
        direction: desc
    
  2. Esegui il deployment degli indici index.yaml in Datastore eseguendo il seguente comando e seguendo le istruzioni:

    gcloud datastore indexes create index.yaml
    

La creazione degli indici in Datastore può richiedere del tempo. La creazione degli indici prima di eseguire il deployment del servizio web in App Engine ti consente di eseguire test locali utilizzando questi indici e di evitare eccezioni che potrebbero verificarsi per le query che richiedono un indice ancora in fase di creazione.

Visualizzare gli indici

Per ulteriori informazioni sulla creazione di indici Datastore, consulta la pagina Configurare gli indici Datastore.

Testare il servizio web

Testa il servizio web eseguendolo localmente in un ambiente virtuale:

  1. Esegui il seguente comando nella directory principale del progetto per eseguire il servizio web. Se non hai configurato un ambiente virtuale per i test locali, consulta Eseguire il test del servizio web.

    python main.py
    
  2. Inserisci il seguente indirizzo nel browser web per visualizzare il servizio web:

    http://localhost:8080
    

Deployment del servizio web

Ora che Datastore funziona in locale, puoi eseguire nuovamente il deployment del servizio web su App Engine.

Esegui il comando seguente dalla directory principale del progetto, dove si trova il file app.yaml:

gcloud app deploy

Tutto il traffico viene instradato automaticamente alla nuova versione di cui è stato eseguito il deployment.

Per saperne di più sulla gestione delle versioni, consulta Gestire servizi e versioni.

Visualizza il servizio

Per avviare rapidamente il browser e accedere al servizio web all'indirizzo https://PROJECT_ID.REGION_ID.r.appspot.com, esegui il seguente comando:

gcloud app browse

Passaggi successivi

Complimenti! Hai creato un servizio web che utilizza lo spazio di archiviazione dei dati di Datastore e l'autenticazione Firebase per fornire agli utenti autenticati una pagina web personalizzata.

Ora puoi eseguire la pulizia arrestando, disattivando o disabilitando la fatturazione per il tuo progetto.