Tutorial: Ligue uma aplicação web Django ao Base de Dados do Azure para PostgreSQL usando o Service Connector

Neste tutorial, aprende a implementar uma aplicação web Python orientada por dados para o Serviço de Aplicações do Azure e usar o Service Service para a ligar a outros serviços Azure. A aplicação web de exemplo armazena informações de restaurantes e avaliações numa base de dados Base de Dados do Azure para PostgreSQL e armazena fotografias num contentor Armazenamento do Azure.

Utiliza o CLI do Azure para completar as seguintes tarefas:

Nota

Este tutorial é semelhante ao tutorial do App Service Deploy uma aplicação web Python Django com PostgreSQL no Azure, mas utiliza uma identidade gerida sem palavra-passe atribuída pelo sistema com controlo de acesso baseado em função do Azure para aceder a outros recursos do Azure. A secção Criar uma ligação de serviço sem palavra-passe deste artigo mostra como o Service Connector simplifica o processo de ligação.

A aplicação web utiliza a classe DefaultAzureCredential da biblioteca cliente Python Azure Identity para detetar automaticamente quando existe uma identidade gerida e utilizá-la para aceder aos outros recursos.

Pré-requisitos

  • Uma subscrição Azure com permissões de escrita e atribuição de funções para os recursos do tutorial, numa região Azure que suporta Service Connector e tenha suporte suficiente para App Service e quota.

  • Azure Cloud Shell para executar os passos do tutorial, ou se preferires correr localmente:

    1. Instale o CLI do Azure 2.87.0 ou posterior. Para verificar a sua versão, execute az version. Para atualizar, execute az upgrade.
    2. Instala Python 3.
    3. Instale o Git.
    4. Inicie sessão no Azure usando az login e seguindo as indicações.

Configurar o ambiente

  1. Registe os Microsoft.ServiceLinker fornecedores de recursos Microsoft.DBforPostgreSQL para a sua subscrição.

    az provider register --namespace Microsoft.ServiceLinker
    az provider register --namespace Microsoft.DBforPostgreSQL
    
  2. Instale a versão mais recente da extensão sem palavra-passe Service Connector. O --upgrade parâmetro atualiza a extensão se já estiver instalada:

    az extension add --name serviceconnector-passwordless --upgrade
    

Clonar a aplicação de exemplo

Importante

O repositório de exemplos do tutorial foi arquivado a 15 de junho de 2026 e já não é mantido ativamente. Usa-o apenas para completar este tutorial.

  1. Clona o repositório da app de exemplo.

    git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
    

    Em alternativa, pode descarregar a aplicação do repositório serviceconnector-webapp-postgresql-django-passwordless e descompactá-la numa pasta chamada serviceconnector-webapp-postgresql-django-passwordless.

  2. Muda diretórios para a pasta repositório usando cd serviceconnector-webapp-postgresql-django-passwordless e executa todos os comandos restantes dessa pasta.

Na aplicação de exemplo, as definições de produção da aplicação web estão no ficheiro azureproject/production.py . As definições de desenvolvimento estão no Azureproject/settings.py. As definições de produção configuram o Django para correr em qualquer ambiente de produção e não são específicas do App Service.

A aplicação utiliza definições de produção quando a WEBSITE_HOSTNAME variável de ambiente está definida. O App Service define esta variável para o nome do host da aplicação, como msdocs-django.azurewebsites.net.

Para mais informações, consulte a lista de verificação de implementação do Django. Veja também Definições de produção para Django em Azure.

Definir variáveis iniciais do ambiente

O código seguinte define as variáveis de ambiente necessárias para este tutorial.

  • LOCATION deve ser uma região do Azure onde a sua subscrição tenha quota suficiente para criar os recursos e não restringe o Azure Database para PostgreSQL para a sua subscrição.
  • A palavra-passe de administrador do PostgreSQL deve conter entre 8 a 128 caracteres de pelo menos três destas categorias: letras maiúsculas, minúsculas, numerais e caracteres não alfanuméricos. Não utilizes $ na palavra-passe deste tutorial.
  1. Configure as seguintes variáveis de ambiente, substituindo <region> por um valor válido:

    LOCATION="<region>"
    RAND_ID=$RANDOM$RANDOM
    RESOURCE_GROUP_NAME="msdocs-mi-web-app-$RAND_ID"
    APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID"
    APP_SERVICE_PLAN_NAME="$APP_SERVICE_NAME-plan"
    DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID"
    DATABASE_NAME="restaurant"
    STORAGE_ACCOUNT_NAME="account$RAND_ID"
    ADMIN_USER="demoadmin"
    
  2. Leia a palavra-passe de administrador do PostgreSQL sem a mostrar ou adicionar ao histórico do seu shell:

    read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo
    
  3. Crie um grupo de recursos para conter todos os recursos do projeto. O nome do grupo de recursos é armazenado em cache e aplicado automaticamente aos comandos subsequentes.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

Implementar o código da aplicação no App Service

Crie o anfitrião da aplicação no App Service, ative a automação da construção e implemente o código de exemplo da aplicação. O plano Basic (B1) de App Service utilizado neste tutorial tem um custo na sua subscrição do Azure. Para os preços atuais, consulte preços de Serviços de Aplicações.

  1. O ficheirorequirements.txt do exemplo arquivado não declara o servidor Gunicorn usado por start.sh. Adicione-o à sua cópia local se ainda não estiver presente:

    grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt
    
  2. Crie um plano de Serviço de Aplicações Linux na faixa de preços Básica (B1) e depois crie a aplicação web com o comando de arranque do exemplo:

    az appservice plan create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_PLAN_NAME \
      --location $LOCATION \
      --sku B1 \
      --is-linux
    
    az webapp create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --plan $APP_SERVICE_PLAN_NAME \
      --runtime "PYTHON:3.14" \
      --startup-file "start.sh"
    
  3. Ative a automatização da compilação do App Service para que a implementação instale os pacotes listados em requirements.txt:

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
    
  4. A partir da raiz do repositório, crie um ficheiro ZIP da aplicação de exemplo e implemente-a usando o az webapp deploy:

    rm -f app.zip
    python -m zipfile -c app.zip *
    
    az webapp deploy \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --src-path app.zip \
      --type zip \
      --track-status false
    
    rm app.zip
    

    O comando de implementação é bem-sucedido quando o App Service aceita o ficheiro ZIP. A construção continua no App Service e pode demorar vários minutos.

Criar a base de dados PostgreSQL no Azure

Crie um servidor e base de dados flexíveis Base de Dados do Azure para PostgreSQL para armazenar os dados da aplicação.

  1. Criar o servidor do Base de Dados do Azure para PostgreSQL:

    az postgres flexible-server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $DB_SERVER_NAME \
      --location $LOCATION \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --sku-name Standard_D2ds_v4 \
      --microsoft-entra-auth Enabled
    

    O comando tem sucesso quando o estado de provisionamento do servidor flexível PostgreSQL é Succeeded.

  2. Remover a palavra-passe de administrador da shell atual após a criação do servidor:

    unset ADMIN_PW
    
  3. Crie a base de dados com az postgres flexible-server db create:

    az postgres flexible-server db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server-name $DB_SERVER_NAME \
      --name $DATABASE_NAME
    

Criar uma ligação de serviço sem palavra-passe

Utilize az webapp connection create postgres-flexible para adicionar um conector de serviço que liga a aplicação Web do Azure à base de dados PostgreSQL através de autenticação sem palavra-passe com identidade gerida. O comando seguinte configura o Base de Dados do Azure para PostgreSQL para usar identidade gerida e controlo de acesso baseado em funções no Azure. A saída do comando lista as ações que o Service Connector realiza.

O comando cria uma configuração de aplicação chamada AZURE_POSTGRESQL_CONNECTIONSTRING que contém a informação da ligação à base de dados. O exemplo lê esta definição no azureproject/production.py. Para obter mais informações, consulte Variáveis de ambiente do Access.

az webapp connection create postgres-flexible \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --server $DB_SERVER_NAME \
  --database $DATABASE_NAME \
  --client-type python \
  --system-identity \
  --yes

A ligação está pronta quando o comando reporta a ligação ao servidor flexível PostgreSQL e cria a configuração da AZURE_POSTGRESQL_CONNECTIONSTRING aplicação.

Ligue a aplicação web Django ao Armazenamento do Azure com o Service Connector

Crie uma conta de armazenamento no Azure e, em seguida, utilize az webapp connection create storage-blob para ligá-la à aplicação Web. O comando de ligação executa as seguintes ações:

  • Ativa a identidade gerida atribuída ao sistema na aplicação web.
  • Adiciona a aplicação Web com a função Storage Blob Data Contributor à conta de armazenamento.
  • Configura a rede de contas de armazenamento para aceitar acesso a partir da aplicação web.
  • Cria uma variável de ambiente chamada AZURE_STORAGEBLOB_RESOURCEENDPOINT para a conta Armazenamento do Azure.

Criar uma conta no Armazenamento do Azure

Crie uma conta de armazenamento v2 de uso geral com armazenamento localmente redundante:

az storage account create \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $STORAGE_ACCOUNT_NAME \
  --location $LOCATION \
  --sku Standard_LRS \
  --kind StorageV2

Criar uma ligação de armazenamento sem palavra-passe

Crie a ligação sem palavra-passe à conta de armazenamento:

az webapp connection create storage-blob \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --target-resource-group $RESOURCE_GROUP_NAME \
  --account $STORAGE_ACCOUNT_NAME \
  --client-type python \
  --system-identity

A ligação está pronta quando o comando indica a ligação à conta de armazenamento e cria a definição AZURE_STORAGEBLOB_RESOURCEENDPOINT da aplicação.

Configure o recipiente da fotografia de amostra

  1. Atualize a conta de armazenamento do Azure para permitir o acesso público de leitura aos blobs para esta aplicação de exemplo arquivada.

    Nota

    Este exemplo arquivado utiliza URLs diretos de blobs para mostrar fotografias, pelo que o tutorial ativa o acesso de leitura anónimo ao contentor photos. Esta configuração é específica para a amostra e não é exigida pelo Service Connector. Para aplicações de produção, mantenha os contentores privados e utilize um método de entrega controlado, como um endpoint de aplicação autenticado.

    az storage account update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --allow-blob-public-access true
    
  2. Atribua ao utilizador com sessão iniciada a permissão para criar o contentor através da autenticação Microsoft Entra:

    SIGNED_IN_USER_ID=$(az ad signed-in-user show --query id --output tsv)
    STORAGE_ACCOUNT_ID=$(az storage account show \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --query id \
      --output tsv)
    
    MSYS_NO_PATHCONV=1 az role assignment create \
      --assignee-object-id $SIGNED_IN_USER_ID \
      --assignee-principal-type User \
      --role "Storage Blob Data Contributor" \
      --scope $STORAGE_ACCOUNT_ID
    

    A definição MSYS_NO_PATHCONV deste comando impede que o Git Bash no Windows converta o ID de recurso do Azure num caminho do Windows. Não tem efeito no Azure Cloud Shell ou noutros ambientes Bash. As atribuições de funções podem demorar alguns minutos a tornar-se eficazes.

  3. Utilize az storage container create para criar um contentor chamado photos e permitir o acesso de leitura anónimo aos blobs nesse contentor:

    BLOB_ENDPOINT=$(az storage account show \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --query primaryEndpoints.blob \
      --output tsv)
    
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

    O contentor está pronto quando a resposta mostra "created": true para o contentor photos.

Teste a aplicação web em Python no Azure

Abra e teste a aplicação web Azure Restaurant Review. A aplicação utiliza o pacote azure.identity e a sua DefaultAzureCredential classe. Quando a aplicação está a correr em Azure, o DefaultAzureCredential deteta automaticamente quando existe uma identidade gerida para o Serviço de Aplicação e usa-a para aceder aos recursos Armazenamento do Azure e Base de Dados do Azure para PostgreSQL. A aplicação não precisa de fornecer chaves de armazenamento, certificados ou credenciais para aceder a estes recursos.

  • Para uma instalação CLI do Azure local, podes usar az webapp browse para abrir a aplicação no teu navegador predefinido:

    az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell não consegue abrir um navegador local, por isso não suporta o comando az webapp browse. A partir do Cloud Shell, selecione o link de domínio predefinido no canto superior direito da página do portal Azure da aplicação.

Pode levar um ou dois minutos para o aplicativo iniciar. Se vires uma página de aplicação padrão que não seja a aplicação de exemplo, aguarda um minuto e atualiza o navegador.

Testa a funcionalidade da aplicação de exemplo adicionando um restaurante e algumas avaliações com fotos. A aplicação deve assemelhar-se à seguinte captura de ecrã:

Captura de ecrã da aplicação web de avaliação de restaurantes de exemplo mostrando uma entrada de restaurante com uma avaliação de cliente e uma foto carregada.

Limpar recursos

Para evitar cobranças contínuas, pode eliminar os recursos que criou para este tutorial eliminando o grupo de recursos que os contém. Certifica-te de que já não precisas da aplicação nem dos recursos antes de executares o comando.

az group delete --name $RESOURCE_GROUP_NAME --no-wait

O comando retorna imediatamente enquanto o Azure apaga os recursos.

Troubleshooting

Se a aplicação não iniciar ou não conseguir ligar-se aos respetivos recursos, verifique os registos de implementação do App Service, confirme que as definições da aplicação AZURE_POSTGRESQL_CONNECTIONSTRING e AZURE_STORAGEBLOB_RESOURCEENDPOINT existem e aguarde alguns minutos para que as atribuições de função do Azure entrem em vigor. Para problemas de arranque de aplicações Python, veja o seguinte artigo: