Tutorial: Conecta una aplicación web de Django a Azure Database for PostgreSQL usando Service Connector

En este tutorial, aprenderá a implementar una aplicación web de Django controlada Python por datos para Azure App Service y usar Service Connector para conectarla a otros servicios Azure. La aplicación web de muestra guarda la información de los restaurantes y las reseñas en una base de datos de Azure Database for PostgreSQL y almacena fotos en un contenedor de Azure Storage.

Usa CLI de Azure para completar las siguientes tareas:

Nota:

Este tutorial es similar al tutorial de App Service Implementar una aplicación web de Django con Python y PostgreSQL en Azure, pero usa una identidad administrada sin contraseña asignada automáticamente por el sistema con control de acceso basado en roles de Azure para acceder a otros recursos de Azure. En la sección Creación de una conexión de servicio sin contraseña de este artículo se muestra cómo Service Connector simplifica el proceso de conexión.

La aplicación web usa la clase DefaultAzureCredential de la biblioteca cliente de Python Azure Identity para detectar automáticamente cuándo existe una identidad administrada y la usa para acceder a los demás recursos.

Prerrequisitos

  • Una suscripción de Azure con permisos de escritura y asignación de roles para los recursos del tutorial, en una región de Azure que admite Service Connector y tiene suficiente soporte y cuota de App Service.

  • Azure Cloud Shell para ejecutar los pasos del tutorial, o si prefiere ejecutar localmente:

    1. Instala CLI de Azure 2.87.0 o una versión posterior. Para comprobar la versión, ejecute az version. Para actualizar, ejecute az upgrade.
    2. Instale Python 3.
    3. Instale Git.
    4. Inicie sesión en Azure mediante az login y siga las indicaciones.

Configuración del entorno

  1. Registra los proveedores de recursos Microsoft.ServiceLinker y Microsoft.DBforPostgreSQL para la suscripción.

    az provider register --namespace Microsoft.ServiceLinker
    az provider register --namespace Microsoft.DBforPostgreSQL
    
  2. Instala la última versión de la extensión sin contraseña Service Connector. El --upgrade parámetro actualiza la extensión si ya está instalada:

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

Clonación de la aplicación de ejemplo

Importante

El repositorio de muestras del tutorial fue archivado el 15 de junio de 2026 y ya no se mantiene activamente. Úsalo solo para completar este tutorial.

  1. Clona el repositorio de la app de ejemplo.

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

    Alternativamente, puedes descargar la aplicación desde el repositorio serviceconnector-webapp-postgresql-django-passwordless y descomprimirla en una carpeta llamada serviceconnector-webapp-postgresql-django-passwordless.

  2. Cambie los directorios a la carpeta del repositorio mediante cd serviceconnector-webapp-postgresql-django-passwordless y ejecute todos los comandos restantes de esa carpeta.

En la aplicación de ejemplo, la configuración de producción de la aplicación web está en el archivo azureproject/production.py . Los ajustes de desarrollo están en Azureproject/settings.py. La configuración de producción configura Django para que se ejecute en cualquier entorno de producción y no sea específica de App Service.

La aplicación usa la configuración de producción cuando se establece la variable de entorno WEBSITE_HOSTNAME. App Service establece esta variable al nombre de host de la app, como msdocs-django.azurewebsites.net.

Para obtener más información, consulte la lista de comprobación de implementación de Django. Consulte también la configuración de Production para Django en Azure.

Definición de variables de entorno iniciales

El código siguiente define las variables de entorno necesarias para este tutorial.

  • LOCATION debe ser una región de Azure en la que la suscripción disponga de cuota suficiente para crear los recursos y no restrinja el uso de Azure Database for PostgreSQL en la suscripción.
  • La contraseña de administrador de PostgreSQL debe contener entre 8 y 128 caracteres de al menos tres de estas categorías: letras mayúsculas, minúsculas, números y caracteres no alfanuméricos. No uses $ en la contraseña de este tutorial.
  1. Configura las siguientes variables de entorno, reemplazándolas <region> por un 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. Lee la contraseña de administrador de PostgreSQL sin mostrarla ni añadirla al historial de tu shell:

    read -s -p "PostgreSQL administrator password: " ADMIN_PW && echo
    
  3. Cree un grupo de recursos para contener todos los recursos del proyecto. El nombre del grupo de recursos se almacena en caché y se aplica automáticamente a los comandos posteriores.

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

Implementación del código de la aplicación en App Service

Crea el host de la app en App Service, activa la automatización de compilaciones y despliega el código de ejemplo de la app. El plan de App Service Basic (B1) utilizado en este tutorial implica un coste en tu suscripción a Azure. Para los precios actuales, consulta precios de los servicios de aplicaciones.

  1. El archivo requirements.txt de la muestra archivada no declara el servidor Gunicorn que usan start.sh. Añádelo a tu copia local si no está ya presente:

    grep -qiE "^gunicorn([=<>~ ]|$)" requirements.txt || echo "gunicorn" >> requirements.txt
    
  2. Crea un plan de Servicio de Aplicaciones para Linux en el rango de precios Básico (B1) y luego crea la aplicación web con el comando de inicio del ejemplo:

    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. Habilite la automatización de compilación de App Service para que la implementación instale los paquetes 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. Desde la raíz del repositorio, crea un archivo ZIP de la aplicación de ejemplo y despláchalo usando 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
    

    El comando de despliegue tiene éxito cuando App Service acepta el archivo ZIP. La compilación continúa en App Service y puede durar varios minutos.

Crea la base de datos PostgreSQL en Azure

Crea un servidor flexible y una base de datos de Azure Database for PostgreSQL para almacenar los datos de la app.

  1. Cree el servidor de Azure Database for 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
    

    El comando tiene éxito cuando el estado de provisión flexible de servidores de PostgreSQL es Succeeded.

  2. Elimina la contraseña de administrador del shell actual después de crear el servidor:

    unset ADMIN_PW
    
  3. Crea la base de datos 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
    

Creación de una conexión de servicio sin contraseña

Utiliza az-webapp connection create postgres-flexible para añadir un conector de servicio que conecta la aplicación web de Azure con la base de datos PostgreSQL usando autenticación de identidad gestionada sin contraseña. El comando siguiente configura Azure Database for PostgreSQL para usar la identidad administrada y Azure control de acceso basado en rol. La salida del comando muestra las acciones que realiza Service Connector.

El comando crea una configuración de aplicación llamada AZURE_POSTGRESQL_CONNECTIONSTRING que contiene la información de la conexión a la base de datos. El ejemplo muestra esta configuración en azureproject/production.py. Para obtener más información, consulte Variables de entorno de 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

La conexión está lista cuando el comando informa de la conexión flexible del servidor PostgreSQL y crea la configuración de la AZURE_POSTGRESQL_CONNECTIONSTRING aplicación.

Conecta la aplicación web de Django a Azure Storage con Service Connector

Crea una cuenta de almacenamiento de Azure y, a continuación, usa az webapp connection create storage-blob para conectarla con la aplicación web. El comando de conexión realiza las siguientes acciones:

  • Habilita la identidad administrada asignada por el sistema en la aplicación web.
  • Añade la aplicación web con el rol Storage Blob Data Contributor a la cuenta de almacenamiento.
  • Configura la red de la cuenta de almacenamiento para aceptar el acceso desde la aplicación web.
  • Crea una variable de entorno denominada AZURE_STORAGEBLOB_RESOURCEENDPOINT para la cuenta de Azure Storage.

Creación de una cuenta de Azure Storage

Crea una cuenta de almacenamiento v2 de propósito general con almacenamiento localmente redundante:

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

Crear una conexión de almacenamiento sin contraseña

Crea la conexión sin contraseña a la cuenta de almacenamiento:

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

La conexión está lista cuando el comando indica la conexión a la cuenta de almacenamiento y crea la configuración de la aplicación AZURE_STORAGEBLOB_RESOURCEENDPOINT.

Configurar el contenedor de fotos de muestra

  1. Actualiza la cuenta de Azure Storage para permitir el acceso público de lectura a los blobs de esta aplicación de muestra archivada.

    Nota:

    Esta muestra archivada utiliza URL directas de blobs para mostrar fotos, por lo que el tutorial habilita el acceso de lectura anónimo al contenedor photos. Esta configuración es específica de la muestra y no es requerida por Service Connector. Para aplicaciones de producción, mantén los contenedores privados y utiliza un método de entrega controlado, como un endpoint de aplicación autenticado.

    az storage account update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $STORAGE_ACCOUNT_NAME \
      --allow-blob-public-access true
    
  2. Asigna el permiso de usuario que has iniciado sesión para crear el contenedor usando la autenticación 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
    

    Establecer MSYS_NO_PATHCONV para este comando evita que Git Bash en Windows convierta el identificador de recurso de Azure en una ruta de Windows. No tiene efecto en Azure Cloud Shell ni en otros entornos de Bash. La asignación de roles puede tardar unos minutos en ser efectiva.

  3. Utiliza az-storage container create para crear un contenedor llamado photos y permitir el acceso anónimo de lectura a los blobs de ese contenedor:

    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
    

    El contenedor está listo cuando la respuesta muestra "created": true para el contenedor photos.

Prueba de la aplicación web de Python en Azure

Abra y pruebe la aplicación web Azure Restaurant Review. La aplicación usa el paquete azure.identity y su DefaultAzureCredential clase. Cuando la aplicación se ejecuta en Azure, el DefaultAzureCredential detecta automáticamente cuándo existe una identidad administrada para App Service y la usa para acceder a los recursos de Azure Storage y Azure Database for PostgreSQL. La aplicación no necesita proporcionar claves de almacenamiento, certificados ni credenciales para acceder a estos recursos.

  • Para una instalación de CLI de Azure local, puede usar az webapp browse para abrir la aplicación en el explorador predeterminado:

    az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell no puede abrir un explorador local, por lo que no admite el comando az webapp browse. Desde Cloud Shell, selecciona el enlace de dominio predeterminado en la esquina superior derecha de la página del portal de Azure de la app.

La aplicación puede tardar uno o dos minutos en iniciarse. Si ve una página de aplicación predeterminada que no es la aplicación de ejemplo, espere un minuto y actualice el explorador.

Pruebe la funcionalidad de la aplicación de ejemplo agregando un restaurante y algunas opiniones con fotos. La aplicación debe ser similar a la siguiente captura de pantalla:

Captura de pantalla de la aplicación web de reseñas de restaurantes de ejemplo mostrando una entrada de restaurante con una reseña de cliente y una foto subida.

Limpieza de recursos

Para evitar cargos continuos, puede eliminar los recursos que creó para este tutorial mediante la eliminación del grupo de recursos que los contiene. Asegúrese de que ya no necesita la aplicación o los recursos antes de ejecutar el comando.

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

El comando regresa inmediatamente mientras Azure elimina los recursos.

Solución de problemas

Si la app no se inicia ni conecta a sus recursos, revisa los registros de despliegue de los servicios de aplicaciones, confirma que existen los AZURE_POSTGRESQL_CONNECTIONSTRING ajustes de la app y AZURE_STORAGEBLOB_RESOURCEENDPOINT deja unos minutos para que las asignaciones de roles en Azure entren en vigor. Para problemas de inicio de aplicaciones en Python, véase el siguiente artículo: