Tutorial: Conecte um aplicativo web Django ao Banco de Dados do Azure para PostgreSQL usando o Service Connector

Neste tutorial, você aprenderá a implantar um aplicativo Web Python Django controlado por dados para Serviço de Aplicativo do Azure e usar o Service Connector para conectá-lo a outros serviços Azure. O aplicativo web de exemplo armazena informações de restaurante e avaliação em um banco de dados do Banco de Dados do Azure para PostgreSQL e armazena fotos em um contêiner do Armazenamento do Azure.

Você usa CLI do Azure para concluir as seguintes tarefas:

Observação

Este tutorial é semelhante ao tutorial do Serviço de Aplicativo Implantar um aplicativo web Python Django com PostgreSQL no Azure, mas usa uma identidade gerenciada sem senha atribuída pelo sistema com controle de acesso baseado em função do Azure para acessar outros recursos do Azure. A seção Criar uma conexão de serviço sem senha deste artigo mostra como o Service Connector simplifica o processo de conexão.

O aplicativo Web usa a classe DefaultAzureCredential da biblioteca de clientes Python Azure Identity para detectar automaticamente quando uma identidade gerenciada existe e a usa para acessar os outros recursos.

Pré-requisitos

Configure seu ambiente

  1. Registre os provedores de recursos Microsoft.ServiceLinker e Microsoft.DBforPostgreSQL na sua assinatura.

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

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

Clonar o aplicativo de exemplo

Importante

O repositório de amostras do tutorial foi arquivado em 15 de junho de 2026 e não é mais mantido ativamente. Use apenas para completar este tutorial.

  1. Clone o repositório do aplicativo de exemplo.

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

    Alternativamente, você pode baixar o aplicativo do repositório serviceconnector-webapp-postgresql-django-passwordless e descompactá-lo em uma pasta chamada serviceconnector-webapp-postgresql-django-passwordless.

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

No aplicativo de exemplo, as configurações de produção do aplicativo web estão no arquivo azureproject/production.py . As configurações de desenvolvimento estão no Azureproject/settings.py. As configurações de produção configuram o Django para ser executado em qualquer ambiente de produção e não são específicas do Serviço de Aplicativo.

O aplicativo usa configurações de produção quando a variável de WEBSITE_HOSTNAME ambiente é definida. O App Service define essa variável para o nome do host do app, como msdocs-django.azurewebsites.net.

Para obter mais informações, consulte a lista de verificação de implantação do Django. Consulte também as configurações de Produção para o Django no Azure.

Definir variáveis de ambiente iniciais

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

  • LOCATION deve ser uma região do Azure onde sua assinatura possui quota suficiente para a criação de recursos e não restrinja o uso do Banco de Dados do Azure para PostgreSQL para sua assinatura.
  • A senha do administrador do PostgreSQL deve conter de 8 a 128 caracteres de pelo menos três dessas categorias: letras maiúsculas, minúsculas, numerais e caracteres não alfanuméricos. Não use $ na senha 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 senha do administrador do PostgreSQL sem exibi-la ou adicioná-la 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
    

Implantar o código do aplicativo no Serviço de Aplicativo

Crie o host do app no App Service, ative a automação da construção e implante o código de exemplo do app. O plano Basic (B1) de App Service usado neste tutorial tem um custo na sua assinatura do Azure. Para preços atuais, veja preços de serviços de aplicativos.

  1. O arquivo requirements.txt do sample 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 Aplicativos Linux na faixa de preços Básica (B1) e então crie o aplicativo web com o comando de inicialização 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 automação de compilação do App Service para que a implantação instale os pacotes de requirements.txt:

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
    
  4. Na raiz do repositório, crie um arquivo ZIP do aplicativo de exemplo e implante-o usando o comando 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 implantação é bem-sucedido quando o App Service aceita o arquivo ZIP. A build continua no App Service e pode levar vários minutos.

Crie o banco de dados PostgreSQL no Azure

Crie um servidor e banco de dados flexíveis no Banco de Dados do Azure para PostgreSQL para armazenar os dados do app.

  1. Crie o servidor do Banco 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 de servidores flexíveis do PostgreSQL é Succeeded.

  2. Remova a senha de administrador do shell atual após a criação do servidor:

    unset ADMIN_PW
    
  3. Crie o banco de dados usando 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 conexão de serviço sem senha

Use az webapp connection create postgres-flexible para adicionar um conector de serviço que conecta o aplicativo Web do Azure ao banco de dados PostgreSQL usando autenticação por identidade gerenciada sem senha. O comando a seguir configura o Banco de Dados do Azure para PostgreSQL para usar a identidade gerenciada e o controle de acesso baseado em função do Azure. A saída do comando lista as ações que o Service Connector executa.

O comando cria uma configuração de aplicativo chamada AZURE_POSTGRESQL_CONNECTIONSTRING que contém as informações de conexão com o banco de dados. O exemplo mostra essa configuraçã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 conexão está pronta quando o comando reporta a conexão do servidor flexível PostgreSQL e cria a AZURE_POSTGRESQL_CONNECTIONSTRING configuração do app.

Conecte o aplicativo web Django ao Armazenamento do Azure com Service Connector

Crie uma conta de armazenamento do Azure e, em seguida, use az webapp connection create storage-blob para conectá-la ao aplicativo Web. O comando de conexão executa as seguintes ações:

  • Habilita a identidade gerenciada atribuída pelo sistema no aplicativo Web.
  • Adiciona o aplicativo Web com a função Storage Blob Data Contributor à conta de armazenamento.
  • Configura a rede da conta de armazenamento para aceitar o acesso do aplicativo Web.
  • Cria uma variável de ambiente chamada AZURE_STORAGEBLOB_RESOURCEENDPOINT para a conta Armazenamento do Azure.

Criar uma conta 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 conexão de armazenamento sem senha

Crie a conexão sem senha para a 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 conexão está pronta quando o comando reporta a conexão da conta de armazenamento e cria a configuração do AZURE_STORAGEBLOB_RESOURCEENDPOINT app.

Configure o contêiner de fotos de amostra

  1. Atualize a conta de armazenamento do Azure para permitir acesso de leitura pública aos blobs para este aplicativo de exemplo arquivado.

    Observação

    Este exemplo arquivado usa URLs diretas de blob para exibir fotos, então o tutorial habilita acesso de leitura anônimo ao contêiner photos. Essa configuração é específica para o exemplo e não é exigida pelo Service Connector. Para aplicativos de produção, mantenha os contêineres 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 sua permissão de usuário logado para criar o container usando 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 configuração MSYS_NO_PATHCONV para esse comando impede que o Git Bash no Windows converta o ID de recurso do Azure em um caminho do Windows. Isso não tem efeito no Azure Cloud Shell ou em outros ambientes Bash. Atribuições de funções podem levar alguns minutos para se tornarem eficazes.

  3. Use az storage container create para criar um contêiner chamado photos e permitir acesso de leitura anônimo aos blobs nesse contêiner:

    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 contêiner está pronto quando a resposta aparece "created": true para o photos contêiner.

Testar o aplicativo Web Python no Azure

Abra e teste o aplicativo Web Azure Restaurant Review. O aplicativo usa o pacote azure.identity e sua DefaultAzureCredential classe. Quando o aplicativo está em execução no Azure, o DefaultAzureCredential detecta automaticamente quando existe uma identidade gerenciada para o Serviço de Aplicativo e o usa para acessar os recursos de Armazenamento do Azure e Banco de Dados do Azure para PostgreSQL. O aplicativo não precisa fornecer chaves de armazenamento, certificados ou credenciais para acessar esses recursos.

  • Para uma instalação de CLI do Azure local, você pode usar az webapp browse para abrir o aplicativo no navegador padrão:

    az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell não pode abrir um navegador local, portanto, ele não dá suporte ao comando az webapp browse. No Cloud Shell, selecione o link Domínio padrão no canto superior direito da página do portal do Azure do aplicativo.

Pode levar um ou dois minutos para o aplicativo iniciar. Se você vir uma página de aplicativo padrão que não é o aplicativo de exemplo, aguarde um minuto e atualize o navegador.

Teste a funcionalidade do aplicativo de exemplo adicionando um restaurante e algumas avaliações com fotos. O aplicativo deve ser semelhante à seguinte captura de tela:

Captura de tela do aplicativo web de avaliação de restaurante mostrando uma entrada de restaurante com uma avaliação de cliente e uma foto enviada.

Limpar os recursos

Para evitar encargos contínuos, você pode excluir os recursos criados para este tutorial excluindo o grupo de recursos que os contém. Verifique se você não precisa mais do aplicativo ou dos recursos antes de executar o comando.

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

O comando retorna imediatamente enquanto Azure exclui os recursos.

Solução de problemas

Se o app não iniciar ou não se conectar aos seus recursos, verifique os logs de implantação do App Service, confirme que as AZURE_POSTGRESQL_CONNECTIONSTRINGconfigurações do appAZURE_STORAGEBLOB_RESOURCEENDPOINT existem e aguarde alguns minutos para que as atribuições de função do Azure entrem em vigor. Para problemas de inicialização de aplicativos em Python, veja o seguinte artigo: