Como executar o Django no ambiente padrão do App Engine

Os aplicativos do Django executados no ambiente padrão do App Engine são escalonados dinamicamente de acordo com o tráfego.

Neste tutorial, presume-se que você esteja familiarizado com o desenvolvimento de Web com o Django. Se você é novo no desenvolvimento do Django, é recomendável escrever seu primeiro aplicativo Django antes de continuar. Nesse tutorial, os modelos do app representam pesquisas que contêm perguntas, e é possível interagir com os modelos usando o console de administração do Django.

Este tutorial requer o Python 3.7.

Antes de começar

  1. Faça login na sua conta do Google.

    Se você ainda não tiver uma, inscreva-se.

  2. No Console do Cloud, na página do seletor de projetos, selecione ou crie um projeto do Cloud.

    Acessar a página do seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud. Saiba como confirmar se a cobrança está ativada para o seu projeto.

  4. Ative a Cloud SQL Admin API.

    Ative a API

  5. Instale e inicialize o SDK do Cloud..

Fazer login no gcloud

Consiga novas credenciais para usar a API Cloud SQL Admin:

gcloud auth application-default login

Fazer o download e executar o app

Depois de concluir os pré-requisitos, faça o download e implante o app de amostra do Django. As seções a seguir contêm as etapas de configuração, execução e implantação do aplicativo.

Como clonar o app do Django

O código para o aplicativo de amostra Django está no repositório GoogleCloudPlatform/python-docs-samples no GitHub.

  1. É possível fazer o download da amostra como um arquivo zip e extraí-lo ou clonar o repositório na máquina local:

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

  2. Acesse o diretório que contém o código de amostra:

    Linux/macOS

    cd python-docs-samples/appengine/standard_python3/django

    Windows

    cd python-docs-samples\appengine\standard_python3\django

Como configurar o ambiente local

Quando implantado, seu aplicativo usa o Cloud SQL Proxy incorporado ao ambiente do App Engine para se comunicar com sua instância do Cloud SQL. No entanto, para testar o aplicativo no local, é necessário instalar e usar uma cópia local do proxy no ambiente de desenvolvimento.

Saiba mais sobre o Cloud SQL Proxy.

Para executar tarefas administrativas básicas na instância do Cloud SQL, use o cliente MySQL.

Ativar a API Cloud SQL Admin

Antes de usar o Cloud SQL, ative a API Admin do Cloud SQL:

gcloud services enable sqladmin

Como instalar o Cloud SQL Proxy

Faça o download do Cloud SQL Proxy e instale-o. Ele se conectará à sua instância do Cloud SQL durante a execução local.

Linux de 64 bits

  1. Faça o download do proxy:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. Torne o proxy executável:
    chmod +x cloud_sql_proxy
    

Linux de 32 bits

  1. Faça o download do proxy:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. Torne o proxy executável:
    chmod +x cloud_sql_proxy
    

macOS de 64 bits

  1. Faça o download do proxy:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. Torne o proxy executável:
    chmod +x cloud_sql_proxy
    

macOS de 32 bits

  1. Faça o download do proxy:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. Torne o proxy executável:
    chmod +x cloud_sql_proxy
    

Windows de 64 bits

Para fazer o download do proxy, clique com o botão direito em https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe e selecione Salvar link como. Renomeie o arquivo para cloud_sql_proxy.exe.

Windows de 32 bits

Para fazer o download do proxy, clique com o botão direito em https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe e selecione Salvar link como. Renomeie o arquivo para cloud_sql_proxy.exe.
Caso seu sistema operacional não esteja incluído aqui, compile o proxy a partir da fonte.

Como criar uma instância do Cloud SQL

  1. Crie uma instância de segunda geração do Cloud SQL para MySQL.

    Atribua o nome polls-instance ou outro similar à instância. Pode levar alguns minutos para a instância ficar pronta. Quando estiver pronta, ela ficará visível na lista de instâncias.

  2. Use o SDK do Cloud para executar o comando a seguir, em que [YOUR_INSTANCE_NAME] representa o nome da instância do Cloud SQL:
    gcloud sql instances describe [YOUR_INSTANCE_NAME]

    Na saída, observe o valor mostrado para [CONNECTION_NAME].

    O valor [CONNECTION_NAME] está no formato [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME].

Como inicializar a instância do Cloud SQL

  1. Inicie o Cloud SQL Proxy usando o valor [CONNECTION_NAME] da etapa anterior:

    Linux/macOS

    ./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306

    Windows

    cloud_sql_proxy.exe -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306

    Substitua [YOUR_INSTANCE_CONNECTION_NAME] pelo valor de [CONNECTION_NAME] registrado na etapa anterior.

    Essa etapa estabelece uma conexão do computador local com a instância do Cloud SQL para testes locais. Mantenha o Cloud SQL Proxy em execução durante todo o teste local do aplicativo.

  2. Crie um usuário e um banco de dados do Cloud SQL:

    Console do Cloud

    1. Crie um novo banco de dados usando o Cloud Console para a instância polls-instance do Cloud SQL. Por exemplo, use o nome polls.
    2. Crie um novo usuário com o Console do Cloud para a instância do Cloud SQLpolls-instance.

    Cliente MySQL

    1. Em uma guia separada da linha de comando, use o cliente MySQL (link em inglês) ou um programa semelhante para se conectar à instância. Quando solicitado, use a senha raiz configurada.
      mysql --host 127.0.0.1 --user root --password
    2. Crie os bancos de dados, usuários e permissões de acesso necessários no banco de dados do Cloud SQL usando os comandos a seguir. Substitua [MYSQL_USER] e [MYSQL_PASSWORD] pelo nome de usuário e senha que você quer usar.
      CREATE DATABASE polls;
      CREATE USER '[MYSQL_USER]' IDENTIFIED BY '[MYSQL_PASSWORD]';
      GRANT ALL ON . TO '[MYSQL_USER]';

Como definir as configurações do banco de dados

  1. Abra mysite/settings.py para edição.

    1. Para ajudar a configurar a conexão com o banco de dados para implantação e teste local do App Engine, defina <your-database-user> e <your-database-password> como o nome de usuário e a senha criados anteriormente na etapa Como criar uma instância do Cloud SQL

    2. Veja os valores da sua instância:

      gcloud sql instances describe [YOUR_INSTANCE_NAME]
      
    3. Na saída, copie o valor connectionName para usar na próxima etapa.

    4. Defina <your-cloudsql-connection-string> como connectionName da etapa anterior.

    5. Configure [YOUR-DATABASE] com o nome que você escolheu durante a etapa Inicializar sua instância do Cloud SQL.

  2. Feche e salve settings.py.

Como executar o app no computador local

  1. Para executar o app do Django no seu computador local, configure um ambiente de desenvolvimento do Python, incluindo Python, pip e virtualenv.

  2. Crie um ambiente Python isolado e instale as dependências:

    Linux/MacOS

    virtualenv env
    source env/bin/activate
    pip install -r requirements.txt
    

    Windows

    virtualenv env
    env\scripts\activate
    pip install -r requirements.txt
    

  3. Execute as migrações do Django para definir seus modelos:

    python manage.py makemigrations
    python manage.py makemigrations polls
    python manage.py migrate
    
  4. Inicie um servidor da Web local:

    python manage.py runserver
    
  5. No navegador, acesse http://localhost:3000/.

    http://localhost:8000
    

    A página exibe o seguinte texto: "Não há pesquisas disponíveis". O servidor da Web do Django em execução no seu computador exibe as páginas do aplicativo de amostra.

  6. Pressione Control+C para interromper o servidor da Web local.

Como usar o console de administração do Django

  1. Crie um superusuário. Você precisa definir um nome de usuário e uma senha.

    python manage.py createsuperuser
    
  2. Inicie um servidor da Web local:

    python manage.py runserver
    
  3. No navegador, acesse http://localhost:8000/admin.

    http://localhost:8000/admin
    
  4. Faça login no site de administração usando o nome de usuário e a senha que você usou ao executar createsuperuser.

Como implantar o app no ambiente padrão do App Engine

  1. Reúna todo o conteúdo estático em uma pasta movendo todos os arquivos estáticos do aplicativo para a pasta especificada por STATIC_ROOT em settings.py:

    python manage.py collectstatic
    
  2. Faça o upload do aplicativo executando o seguinte comando no diretório python-docs-samples/appengine/standard/django do aplicativo em que o arquivo app.yaml está localizado:

    gcloud app deploy
    

    Aguarde a notificação sobre a conclusão da atualização.

Como ver o aplicativo executado no Google Cloud

O comando a seguir implanta o aplicativo conforme descrito em app.yaml e define a versão recém-implantada como padrão. Com isso, ela veicula todo o tráfego novo.

Sua solicitação é atendida por um servidor da Web em execução no ambiente padrão do App Engine.

Se você atualizar o app, implante a versão atualizada inserindo o mesmo comando usado para implantá-lo. A implantação cria uma nova versão do app e a define como padrão. As versões anteriores do seu app são mantidas. Todas essas versões do app são recursos faturáveis. Para reduzir custos, exclua as versões não padrão do seu app.

Para informações sobre a exclusão de versões não padrão do seu app, consulte Como limpar o ambiente.

Produção

Quando você estiver pronto para veicular seu conteúdo na produção, em mysite/settings.py, altere a variável DEBUG para False.

Noções básicas sobre o código

O app de exemplo do Django foi criado com ferramentas padrão do Django.

  • Os comandos a seguir criam o projeto e o aplicativo de pesquisa:

    django-admin startproject mysite
    
    python manage.py startapp polls
    
  • O arquivo settings.py contém a configuração do banco de dados SQL. O código em settings.py usa a variável de ambiente GAE_APPLICATION para determinar se o aplicativo está sendo executado no App Engine ou no seu computador local:

    • Quando o aplicativo é executado no App Engine, ele se conecta ao host do MySQL usando o soquete Unix /cloudsql.
    • Se é executado no seu computador local, ele se conecta ao host do MySQL usando TCP, o que requer um nome de usuário e uma senha.
    if os.getenv('GAE_APPLICATION', None):
        # Running on production App Engine, so connect to Google Cloud SQL using
        # the unix socket at /cloudsql/<your-cloudsql-connection string>
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'HOST': '/cloudsql/[YOUR-CONNECTION-NAME]',
                'USER': '[YOUR-USERNAME]',
                'PASSWORD': '[YOUR-PASSWORD]',
                'NAME': '[YOUR-DATABASE]',
            }
        }
    else:
        # Running locally so connect to either a local MySQL instance or connect to
        # Cloud SQL via the proxy. To start the proxy via command line:
        #
        #     $ cloud_sql_proxy -instances=[INSTANCE_CONNECTION_NAME]=tcp:3306
        #
        # See https://cloud.google.com/sql/docs/mysql-connect-proxy
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'HOST': '127.0.0.1',
                'PORT': '3306',
                'NAME': '[YOUR-DATABASE]',
                'USER': '[YOUR-USERNAME]',
                'PASSWORD': '[YOUR-PASSWORD]',
            }
        }
  • O arquivo app.yaml contém informações de configuração para implantação no App Engine. Este arquivo app.yaml especifica que o App Engine exibe arquivos estáticos do diretório static/:

    runtime: python38
    
    handlers:
    # This configures Google App Engine to serve the files in the app's static
    # directory.
    - url: /static
      static_dir: static/
    
    # This handler routes all requests not caught above to your main app. It is
    # required when static routes are defined, but can be omitted (along with
    # the entire handlers section) when there are no static files defined.
    - url: /.*
      script: auto