Personalize os dados para utilizadores autenticados

ID da região

O REGION_ID é um código abreviado que a Google atribui com base na região que seleciona quando cria a sua app. O código não corresponde a um país ou uma província, embora alguns IDs de regiões possam parecer semelhantes aos códigos de países e províncias usados frequentemente. Para apps criadas após fevereiro de 2020, REGION_ID.r está incluído nos URLs do App Engine. Para apps existentes criadas antes desta data, o ID da região é opcional no URL.

Saiba mais acerca dos IDs de regiões.

Use informações de utilizadores autenticados para armazenar e obter dados específicos do utilizador e personalize a experiência de cada utilizador com o seu serviço Web.

Num passo anterior, atualizou o serviço Web para apresentar os últimos dez pedidos de todos os utilizadores. Neste passo, usa informações de utilizadores autenticados para atualizar o seu serviço Web, de modo que a página apresente apenas uma lista dos últimos dez pedidos feitos pelo utilizador autenticado atualmente.

Antes de começar

Se tiver concluído todos os passos anteriores neste guia, ignore esta secção. Caso contrário, conclua uma das seguintes opções:

  • Comece por Criar uma app Python 3 e conclua todos os passos anteriores a este.

  • Se já tiver um Google Cloud projeto, pode continuar a descarregar uma cópia do serviço Web e adicionar o Firebase:

    1. Transfira o repositório da aplicação de exemplo através do Git:

      git clone https://github.com/GoogleCloudPlatform/python-docs-samples
      

      Em alternativa, pode transferir o exemplo como um ficheiro ZIP e, de seguida, extraí-lo.

    2. Navegue para o diretório que contém uma cópia dos ficheiros do passo anterior:

      cd python-docs-samples/appengine/standard_python3/building-an-app/building-an-app-3
      
    3. Adicione o Firebase ao seu Google Cloud projeto e serviço Web.

Armazene e obtenha dados específicos do utilizador

Pode indicar que os dados estão associados a um determinado utilizador através de antepassados do Firestore no modo Datastore (Datastore), que lhe permitem organizar os dados do Datastore hierarquicamente.

Para tal, efetue os seguintes passos:

  1. Atualize os métodos store_time e fetch_time para usar antepassados do Datastore para armazenar e obter entidades 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
    
    

    Cada entidade visit tem agora um elemento principal ao qual está ligada. Estes antecessores são entidades do Datastore que representam utilizadores autenticados individuais. A chave de cada antepassado inclui o User tipo e um ID personalizado, que é o endereço de email do utilizador autenticado. Usa a chave principal para consultar a base de dados apenas para os horários associados a um utilizador específico.

  2. Atualize a chamada do método store_times no método root e mova-a para dentro da condição id_token para que só seja executada se o servidor tiver autenticado um utilizador:

    @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
        )
    
    

Configure índices

O Datastore faz consultas com base em índices. Para entidades simples, o Datastore gera automaticamente estes índices. No entanto, não pode gerar automaticamente índices para entidades mais complicadas, incluindo as que têm antecessores. Por este motivo, tem de criar manualmente um índice para as entidades visit para que o Datastore possa executar consultas que envolvam entidades visit.

Para criar um índice para entidades visit, conclua os seguintes passos:

  1. Crie um ficheiro index.yaml no diretório raiz do seu projeto, por exemplo, building-an-app, e adicione o seguinte índice:

    # 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. Implemente os seus index.yaml índices no Datastore executando o seguinte comando e seguindo as instruções:

    gcloud datastore indexes create index.yaml
    

O Datastore pode demorar algum tempo a criar índices. A criação de índices antes de implementar o seu serviço Web no App Engine permite-lhe testar localmente com esses índices e evita exceções que possam ocorrer para consultas que exijam um índice que ainda esteja em processo de criação.

Veja os seus índices

Para mais informações sobre como criar índices do Datastore, consulte o artigo Configurar índices do Datastore.

Testar o seu serviço Web

Teste o seu serviço Web executando-o localmente num ambiente virtual:

  1. Execute o seguinte comando no diretório principal do projeto para executar o serviço Web. Se não configurou um ambiente virtual para testes locais, consulte o artigo sobre como testar o seu serviço Web.

    python main.py
    
  2. Introduza o seguinte endereço no seu navegador de Internet para ver o serviço Web:

    http://localhost:8080
    

Implemente o seu serviço Web

Agora que tem o Datastore a funcionar localmente, pode voltar a implementar o seu serviço Web no App Engine.

Execute o seguinte comando a partir do diretório raiz do seu projeto, onde se encontra o ficheiro app.yaml:

gcloud app deploy

Todo o tráfego é encaminhado automaticamente para a nova versão implementada.

Para mais informações sobre a gestão de versões, consulte o artigo Faça a gestão de serviços e versões.

Veja o seu serviço

Para iniciar rapidamente o navegador e aceder ao seu serviço Web em https://PROJECT_ID.REGION_ID.r.appspot.com, execute o seguinte comando:

gcloud app browse

Passos seguintes

Parabéns! Criou com êxito um serviço Web que usa o armazenamento de dados do Datastore e a autenticação do Firebase para fornecer aos utilizadores autenticados uma página Web personalizada.

Agora, pode fazer a limpeza encerrando, desativando ou desativando a faturação do seu projeto.