Usar o servidor de desenvolvimento local

Pode usar o servidor de desenvolvimento local para simular a execução da sua aplicação do App Engine em produção, bem como usá-lo para aceder aos serviços incluídos do App Engine.

O ambiente simulado aplica algumas restrições da sandbox, como funções de sistema restritas e importações de módulos do Python 2, mas não outras, como limites de tempo ou quotas de pedidos.

O servidor de desenvolvimento local também simula os serviços fornecidos pelas bibliotecas no SDK do App Engine, incluindo o armazenamento de dados, a cache de memória e as filas de tarefas, executando as respetivas tarefas localmente. Quando a sua aplicação está a ser executada no servidor de desenvolvimento, continua a poder fazer chamadas de API remotas para a infraestrutura de produção através dos pontos finais HTTP das APIs Google.

Antes de começar

Uma vez que o Python 2.7 atingiu o fim do suporte, já não pode usar a versão mais recente do dev_appserver.py para executar localmente as suas aplicações. Para transferir uma versão arquivada do devapp_server.py, siga estes passos:

  1. A partir do arquivo, transfira a pasta comprimida que contém o dev_appserver.py servidor para tempos de execução que atingiram o fim do apoio técnico.

  2. Extraia o conteúdo do diretório para o seu sistema de ficheiros local, como o diretório /home. Pode encontrar o dev_appserver.py no diretório google_appengine/.

Configure o servidor de desenvolvimento local

Para executar a ferramenta de servidor de desenvolvimento local, tem de configurar o seguinte:

  1. Verifique se instalou um intérprete do Python 2 da versão 2.7.12 ou posterior.

  2. Defina a variável de ambiente DEVAPPSERVER_ROOT na sua shell para o caminho do seu intérprete do Python 2.

Execute o servidor de desenvolvimento local

Depois de configurar o servidor de desenvolvimento local e criar o ficheiro de configuração app.yaml para a sua app, pode usar o comando dev_appserver.py para executar a app localmente.

Para iniciar o servidor de desenvolvimento local:

  1. No diretório que contém o ficheiro de configuração app.yaml, execute o comando dev_appserver.py.

    Especifique o caminho do diretório para a sua app, por exemplo:

         python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py [PATH_TO_YOUR_APP]
    

    Em alternativa, pode especificar o ficheiro de configuração de um serviço específico, por exemplo:

         python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py app.yaml
    

    Para alterar a porta, inclua a opção --port:

         python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --port=9999 [PATH_TO_YOUR_APP]
    

    Substitua [DEVAPPSERVER_ROOT] pelo caminho para a pasta onde extrai a versão arquivada de devapp_server.py.

    Para saber mais acerca das opções de comando dev_appserver.py, consulte as opções do servidor de desenvolvimento local.

  2. O servidor de programação local está agora em execução e a ouvir pedidos. Pode visitar http://localhost:8080/ no seu navegador de Internet para ver a app em ação.

    Se especificou uma porta personalizada com a opção --port, lembre-se de abrir o seu navegador nessa porta.

Para parar o servidor local a partir da linha de comandos, prima o seguinte:

  • macOS ou Linux: Control+C
  • Windows: Control+Break

Especifique os IDs das aplicações

Para aceder ao ID da app no servidor local, por exemplo, para roubar um endereço de email, use a função get_application_id(). Para obter o nome do anfitrião da app em execução, use a função get_default_version_hostname().

Detetar o ambiente de tempo de execução da aplicação

Para determinar se o seu código está a ser executado em produção ou no servidor de desenvolvimento local, pode verificar o valor da variável de ambiente SERVER_SOFTWARE:

if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
  # Production
else:
  # Local development server

Usar o Datastore local

O servidor de desenvolvimento local simula o Datastore do App Engine através de um ficheiro local que persiste entre invocações do servidor local.

Para mais informações sobre os índices e o index.yaml, consulte as páginas Índices do armazenamento de dados e Configuração do índice do armazenamento de dados.

Explore o Armazenamento de dados local

Se a sua app tiver escrito dados no Datastore local através do servidor de desenvolvimento local, pode procurá-los na consola de desenvolvimento local.

Para procurar no Armazenamento de dados local:

  1. Inicie o servidor de programação.

  2. Aceda ao Datastore Viewer na consola de desenvolvimento local. (O URL é http://localhost:8000/datastore.)

  3. Ver o conteúdo do seu Armazenamento de dados local.

Especifique a política de atribuição de IDs

Para a produção do App Engine, pode definir o Datastore para gerar automaticamente IDs de entidades.

Embora as políticas de atribuição automática de IDs para o servidor de produção sejam completamente diferentes das usadas pelo servidor de desenvolvimento, também pode definir a política de atribuição automática de IDs para o servidor local.

Para especificar a política de atribuição automática de IDs, use a opção --auto_id_policy:

python2 DEVAPPSERVER_ROOT/google_appengine/dev_appserver.py --auto_id_policy=sequential

Substituição:

  • DEVAPPSERVER_ROOT com o caminho para a pasta onde extrai a versão arquivada do devapp_server.py.

  • --auto_id_policy com uma das seguintes opções:

    • scattered quando os IDs (predefinição) são atribuídos a partir de uma sequência não repetida de números inteiros distribuídos de forma aproximadamente uniforme.
    • sequential quando os IDs são atribuídos a partir da sequência de números inteiros consecutivos.

Limpe o Datastore local

Para limpar o armazenamento de dados local de uma aplicação, invoque o servidor de desenvolvimento local da seguinte forma:

python2 DEVAPPSERVER_ROOT/google_appengine/dev_appserver.py --clear_datastore=yes app.yaml

Substitua DEVAPPSERVER_ROOT pelo caminho para a pasta onde extrai a versão arquivada de devapp_server.py.

Altere a localização do Datastore local

Para alterar a localização usada para o ficheiro de repositório de dados, use a opção --datastore_path:

python2 DEVAPPSERVER_ROOT/google_appengine/dev_appserver.py --datastore_path=/tmp/myapp_datastore app.yaml

Substitua DEVAPPSERVER_ROOT pelo caminho para a pasta onde extrai a versão arquivada de devapp_server.py.

Use o serviço Users

O App Engine fornece um serviço de utilizadores para simplificar a autenticação e a autorização da sua aplicação. O servidor de desenvolvimento local simula o comportamento das Contas Google com as suas próprias páginas de início e fim de sessão. Quando executadas no servidor de desenvolvimento local, as funções users.create_login_url e users.create_logout_url devolvem URLs para /_ah/login e /_ah/logout no servidor local.

Use o Mail

O servidor de desenvolvimento local pode enviar emails para chamadas ao serviço de email do App Engine através de um servidor SMTP ou de uma instalação local do Sendmail.

Usar o SMTP

Para ativar o suporte de correio com um servidor SMTP, invoque dev_appserver.py da seguinte forma:

   python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --smtp_host=smtp.example.com --smtp_port=25 \
    --smtp_user=ajohnson --smtp_password=k1tt3ns [PATH_TO_YOUR_APP]

Substituição:

  • [DEVAPPSERVER_ROOT] com o caminho para a pasta onde extrai a versão arquivada do devapp_server.py.
  • --smtp_host, --smtp_port, --smtp_user e --smtp_password opções com os seus próprios valores de configuração.

Usar o Sendmail

Para ativar o apoio técnico por email com o Sendmail, invoque dev_appserver.py da seguinte forma:

   python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --enable_sendmail=yes [PATH_TO_YOUR_APP]

Substitua [DEVAPPSERVER_ROOT] pelo caminho para a pasta onde extraiu a versão arquivada de devapp_server.py.

O servidor local usa o comando sendmail para enviar mensagens de email com a configuração predefinida da sua instalação.

Use a obtenção de URLs

Quando a sua aplicação usa a API URL Fetch para fazer um pedido HTTP, o servidor de desenvolvimento local faz o pedido diretamente a partir do seu computador. O comportamento da obtenção de URLs no servidor local pode diferir do App Engine de produção se usar um servidor proxy para aceder a Websites.

Use a consola interativa

A consola interativa permite que os programadores introduzam código Python arbitrário num formulário Web e o executem no ambiente da respetiva app. Fornece o mesmo acesso ao ambiente e aos serviços da aplicação que um ficheiro .py na própria aplicação.

Para usar a consola interativa:

  1. Inicie o servidor de programação.

  2. Aceda à consola interativa na na consola de programação local. (O URL é http://localhost:8000/console.)

  3. Introduza o código Python que quer executar na área de texto e, em seguida, envie o formulário para o executar. Por exemplo, o código seguinte adiciona uma entidade do Datastore denominada Greeting com o conteúdo de texto Hello:

      from google.appengine.ext import ndb
      class Greeting(ndb.Model):
        content = ndb.TextProperty()
    
      e = Greeting(content="Hello")
      e.put()
    

Depure com o depurador Python

Para usar o depurador do Python (pdb):

  1. Adicione a seguinte linha ao seu código:

    import pdb; pdb.set_trace();
    

    Neste ponto, o dev_appserver vai falhar e entrar no pdb REPL (ciclo de leitura-avaliação-impressão), o que lhe permite depurar o código a partir da linha de comandos.

  2. Se a sua aplicação fizer vários pedidos simultâneos que invocam pdb.set_trace(), são iniciadas várias sessões de depuração em simultâneo, cada uma das quais envia resultados para STDOUT. Para evitar esta situação, serializar os pedidos desativando o suporte de processamento múltiplo e várias linhas de execução do dev_appserver, da seguinte forma:

    1. Desative a multithreading para:

      • Todos os serviços que usam a flag --threadsafe_override=false.
      • Um serviço que usa a flag --threadsafe_override=<SERVICENAME>:false.
      • Vários serviços que usam a flag --threadsafe_override=<SERVICE1NAME>:false,<SERVICE2NAME>:false.
    2. Desative o multiprocessamento para:

      • Todos os serviços que usam a flag --max_module_instances=1.
      • Um serviço que usa a flag --max_module_instances=<SERVICENAME>:1.
      • Vários serviços que usam a flag --max_module_instances=<SERVICE1NAME>:1,<SERVICE2NAME>:1.