Implementación de una aplicación web Python (Django o Flask) con PostgreSQL en Azure

En este tutorial, implementará una aplicación web de Python controlada por datos (Django o Flask) en Azure App Service con el servicio de base de datos relacional Azure Database for PostgreSQL. Azure App Service admite Python en un entorno de servidor Linux.

An architecture diagram showing an App Service with a PostgreSQL database in Azure.

Para completar este tutorial, necesita:

Ir al final

Con Azure Developer CLI instalado, puede implementar una aplicación de ejemplo totalmente configurada, que se muestra en este tutorial, y verla en ejecución en Azure. Solo tiene que ejecutar los siguientes comandos en un directorio de trabajo vacío:

azd auth login
azd init --template msdocs-flask-postgresql-sample-app
azd up

Aplicación de ejemplo

Se proporcionan aplicaciones de Python de ejemplo que usan el marco Flask y Django para ayudarle a seguir este tutorial. Para implementarlas sin ejecutarlas localmente, omita esta parte.

Para ejecutar la aplicación localmente, asegúrese de que tiene Python 3.7 o posterior y PostgreSQL instalados localmente. A continuación, clone la rama starter-no-infra del repositorio de ejemplo y cambie a la raíz del repositorio.

git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app
cd msdocs-flask-postgresql-sample-app

Cree un archivo .env como se ve a continuación, con el archivo .env.sample como guía. Establezca el valor de DBNAME en el nombre de una base de datos existente en la instancia de PostgreSQL local. Establezca los valores de DBHOST, DBUSER y DBPASS según corresponda para la instancia de PostgreSQL local.

DBNAME=<database name>
DBHOST=<database-hostname>
DBUSER=<db-user-name>
DBPASS=<db-password>

Cree un entorno virtual para la aplicación:

py -m venv .venv
.venv\scripts\activate

Instale las dependencias:

pip install -r requirements.txt

Ejecute la aplicación de ejemplo con los comandos siguientes:

# Run database migration
flask db upgrade
# Run the app at http://127.0.0.1:5000
flask run

1. Creación de una instancia de App Service y PostgreSQL

git clone https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app.git

En este paso, creará los recursos de Azure. Los pasos que se usan en este tutorial crean un conjunto de recursos seguros de forma predeterminada que incluyen App Service y Azure Database for PostgreSQL. En el proceso de creación especificará lo siguiente:

  • El Nombre de la aplicación web. Es el nombre que se usa como parte del nombre DNS de la aplicación web en el formato https://<app-name>.azurewebsites.net.
  • La región para ejecutar la aplicación físicamente en el mundo.
  • La pila en tiempo de ejecución para la aplicación. Es donde se selecciona la versión de Python que se va a usar para la aplicación.
  • El plan de hospedaje para la aplicación. Es el plan de tarifa que incluye el conjunto de características y la capacidad de escalado de la aplicación.
  • El Grupo de recursos de la aplicación. Un grupo de recursos permite agrupar (en un contenedor lógico) todos los recursos de Azure necesarios para la aplicación.

Inicie sesión en Azure Portal y siga estos pasos para crear los recursos de Azure App Service.

Paso 1: En el portal Azure:

  1. Escriba "base de datos de aplicación web" en la barra de búsqueda de la parte superior de Azure Portal.
  2. Seleccione el elemento denominado Aplicación web + base de datos en el encabezado Marketplace. También puede ir directamente al asistente de creación.

A screenshot showing how to use the search box in the top tool bar to find the Web App + Database creation wizard (Flask).

Paso 2: In the páginaCrear aplicación web + base de datos, rellene el formulario de la siguiente manera.

  1. Grupo de recursos → seleccione Crear nuevo y use el nombre msdocs-python-postgres-tutorial.
  2. Región → Cualquier región de Azure cercana.
  3. Nombremsdocs-python-postgres-XYZ, donde XYZ son tres caracteres aleatorios. Este nombre debe ser único en Azure.
  4. Pila en tiempo de ejecuciónPython 3.10.
  5. Base de datosPostgreSQL: servidor flexible está seleccionado de manera predeterminada como motor de base de datos. El nombre del servidor y el nombre de la base de datos también se establecen de manera predeterminada en los valores adecuados.
  6. Plan de hospedajeBásico. Cuando esté listo, puede escalar verticalmente a un plan de tarifa de producción más adelante.
  7. Seleccione Revisar + crear.
  8. Una vez completada la validación, seleccione Crear.

A screenshot showing how to configure a new app and database in the Web App + Database wizard (Flask).

Step 3:La implementación tarda unos minutos en completarse. Una vez completada la implementación, seleccione el botón Ir al recurso. Se le dirigirá directamente a la aplicación App Service, pero se crean los siguientes recursos:

  • Grupo de recursos → Contenedor de todos los recursos creados.
  • Plan de App Service → Define los recursos de proceso de App Service. Se crea un plan de Linux en el nivel Básico.
  • App Service → Representa su aplicación y se ejecuta en el plan de App Service.
  • Red virtual → Se integra con la aplicación App Service y aísla el tráfico de red de back-end.
  • Servidor flexible de Azure Database for PostgreSQL → Accesible solo desde la red virtual. Una base de datos y un usuario se crean automáticamente en el servidor.
  • Zona DNS privada → Habilita la resolución DNS del servidor de PostgreSQL en la red virtual.

A screenshot showing the deployment process completed (Flask).

2. Comprobación de los valores de configuración de la conexión

El Asistente para la creación generó automáticamente las variables de conectividad como valores de configuración de la aplicación. La configuración de la aplicación es una forma de mantener los secretos de conexión fuera del repositorio de código. Cuando esté listo para mover los secretos a una ubicación más segura, consulte este artículo sobre el almacenamiento en Azure Key Vault.

Paso 1: En la página App Service, en el menú de la izquierda, seleccione Configuración.

A screenshot showing how to open the configuration page in App Service (Flask).

Paso 2: en la pestaña Configuración de la aplicación de la página Configuración, compruebe que AZURE_POSTGRESQL_CONNECTIONSTRING esté presente. Se insertará en el entorno de tiempo de ejecución como variable de entorno.

A screenshot showing how to see the autogenerated connection string (Flask).

Paso 3: en un terminal o símbolo del sistema, ejecute el siguiente script de Python para generar un secreto único: python -c 'import secrets; print(secrets.token_hex())'. Copie el valor de salida que se usará en el paso siguiente.

3. Implementación del código de ejemplo

En este paso, configurará la implementación de GitHub mediante Acciones de GitHub. Es solo una de las muchas maneras de implementar en App Service, pero también una excelente manera de disponer de integración continua en el proceso de implementación. De forma predeterminada, cada uno de los repositorios git push de GitHub iniciará la acción de compilación e implementación.

Paso 1: En una nueva ventana del navegador:

  1. Inicie sesión en su cuenta de GitHub.
  2. Vaya a https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app.
  3. Seleccione Bifurcación.
  4. Seleccione Crear bifurcación.

A screenshot showing how to create a fork of the sample GitHub repository (Flask).

Paso 2: En la página de GitHub, abre Visual Studio Code en el navegador pulsando la tecla ..

A screenshot showing how to open the Visual Studio Code browser experience in GitHub (Flask).

Paso 3: en el explorador de Visual Studio Code, abra azureproject/production.py. Consulte las variables de entorno que se usan en el entorno de producción, incluida la configuración de la aplicación que vio en la página de configuración.

A screenshot showing Visual Studio Code in the browser and an opened file (Flask).

Paso 4: De nuevo en la página App Service, en el menú de la izquierda, seleccione Centro de implementación.

A screenshot showing how to open the deployment center in App Service (Flask).

Paso 5: En la página Centro de implementación:

  1. En Origen, seleccione GitHub. De forma predeterminada, Acciones de GitHub está seleccionado como proveedor de compilación.
  2. Inicie sesión en su cuenta de GitHub y siga las indicaciones para autorizar a Azure.
  3. En Organización, seleccione su cuenta.
  4. En Repositorio, seleccione msdocs-flask-postgresql-sample-app.
  5. En Rama, seleccione main.
  6. Mantenga la opción predeterminada seleccionada para Agregar un flujo de trabajo.
  7. En Tipo de autenticación, seleccione Identidad asignada por el usuario.
  8. En el menú superior, elija Guardar. App Service confirma un archivo de flujo de trabajo en el repositorio de GitHub escogido, en el directorio .github/workflows.

A screenshot showing how to configure CI/CD using GitHub Actions (Flask).

Paso 6: En la página Centro de implementación:

  1. Seleccione Registros. Ya hay iniciada una ejecución de implementación.
  2. En el elemento de registro de la ejecución de implementación, seleccione Compilar o implementar registros.

A screenshot showing how to open deployment logs in the deployment center (Flask).

Paso 7: Se le llevará al repositorio de GitHub, donde ve que la acción de GitHub se está ejecutando. El archivo de flujo de trabajo define dos fases independientes: compilación e implementación. Espere a que la ejecución de GitHub muestre el estado Completado. Tardará unos 5 minutos.

A screenshot showing a GitHub run in progress (Flask).

¿Tiene problemas? Consulte la Guía de solución de problemas.

4. Generación del esquema de la base de datos

Con la base de datos PostgreSQL protegida por la red virtual, la manera más fácil de ejecutar migraciones de base de datos de Flask es mediante una sesión SSH con el contenedor de App Service.

Paso 1: De vuelta en la página App Service, en el menú de la izquierda,

  1. Seleccione SSH.
  2. Seleccione Ir.

A screenshot showing how to open the SSH shell for your app from the Azure portal (Flask).

Paso 2: en el terminal SSH, ejecute flask db upgrade. Si se realiza correctamente, App Service se conecta a la base de datos. Cuando la aplicación se reinicie, solo persisten los cambios realizados en los archivos ubicados en /home. Los cambios efectuados fuera de /home no se conservan.

A screenshot showing the commands to run in the SSH shell and their output (Flask).

5. Navegación hasta la aplicación

Paso 1. En la página App Service:

  1. En el menú de la izquierda, seleccione Información general.
  2. Seleccione la dirección URL de la aplicación. También puede navegar directamente a https://<app-name>.azurewebsites.net.

A screenshot showing how to launch an App Service from the Azure portal (Flask).

Paso 2: agregue algunos restaurantes a la lista. Enhorabuena, ya está ejecutando una aplicación web en Azure App Service, con conectividad protegida a Azure Database for PostgreSQL.

A screenshot of the Flask web app with PostgreSQL running in Azure showing restaurants and restaurant reviews (Flask).

6. Transmisión de registros de diagnóstico

Azure App Service captura toda la salida de mensajes hacia la consola, para ayudarle a diagnosticar problemas de la aplicación. La aplicación de ejemplo incluye instrucciones print() para demostrar esta funcionalidad, como se muestra a continuación.

@app.route('/', methods=['GET'])
def index():
    print('Request for index page received')
    restaurants = Restaurant.query.all()
    return render_template('index.html', restaurants=restaurants)

Paso 1. En la página App Service:

  1. En el menú de la izquierda, seleccione Registros de App Service.
  2. En Registro de aplicaciones, seleccione Sistema de archivos.
  3. En el menú superior, elija Guardar.

A screenshot showing how to enable native logs in App Service in the Azure portal.

Paso 2: En el menú de la izquierda, seleccione Flujo de registro. Verá los registros de la aplicación, incluidos los registros de plataforma y los registros de dentro del contenedor.

A screenshot showing how to view the log stream in the Azure portal.

Obtenga más información sobre cómo iniciar sesión en aplicaciones de Python en la serie sobre cómo configurar Azure Monitor para la aplicación Python.

7. Limpieza de recursos

Cuando acabe, puede eliminar todos los recursos de la suscripción de Azure mediante la eliminación del grupo de recursos.

Paso 1:En la barra de búsqueda de la parte superior de Azure Portal:

  1. Escriba el nombre del grupo de recursos.
  2. Seleccione el grupo de recursos.

A screenshot showing how to search for and navigate to a resource group in the Azure portal.

Paso 2: En la página del grupo de recursos, seleccione Borrar grupo de recursos.

A screenshot showing the location of the Delete Resource Group button in the Azure portal.

Paso 3:

  1. Escriba el nombre del grupo de recursos para confirmar la eliminación.
  2. Seleccione Eliminar.

A screenshot of the confirmation dialog for deleting a resource group in the Azure portal. :

1. Creación de recursos de Azure e implementación de una aplicación de ejemplo

En este paso, creará los recursos de Azure e implementará una aplicación de ejemplo en App Service en Linux. Los pasos que se usan en este tutorial crean un conjunto de recursos seguros de forma predeterminada que incluyen App Service y Azure Database for PostgreSQL.

  1. Si aún no lo ha hecho, clone la rama starter-no-infra del repositorio de ejemplo en un terminal local.

    git clone -b starter-no-infra https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app
    cd msdocs-flask-postgresql-sample-app
    

    Esta rama clonada es el punto de partida. Contiene una aplicación Flask de unidad de datos simple.

  2. Desde la raíz del repositorio, ejecute azd init.

    azd init --template python-app-service-postgresql-infra
    
  3. Cuando se le solicite, proporcione las siguientes respuestas:

    Pregunta Respuesta
    El directorio actual no está vacío. ¿Desea inicializar un proyecto aquí en "<su directorio>"? Y
    ¿Qué quiere hacer con estos archivos? Mantener mis archivos existentes sin cambios
    Escribir un nuevo nombre de entorno Escriba un nombre único. La plantilla azd usa este nombre como parte del nombre DNS de la aplicación web en Azure (<app-name>.azurewebsites.net). Se permiten caracteres alfanuméricos y guiones.
  4. Ejecute el comando azd up para aprovisionar los recursos de Azure necesarios e implementar el código de la aplicación. Si aún no ha iniciado sesión en Azure, el explorador se iniciará y le pedirá que inicie sesión. El comando azd up también le pedirá que seleccione la suscripción y la ubicación deseadas para la implementación.

    azd up
    

    El comando azd up puede tardar unos minutos en completarse. También compila e implementa el código de la aplicación, pero modificará el código más adelante para trabajar con App Service. Mientras se ejecuta, el comando proporciona mensajes sobre el proceso de aprovisionamiento e implementación, incluido un vínculo a la implementación en Azure. Cuando termina, el comando también muestra un vínculo a la aplicación implementada.

    Esta plantilla de azd contiene archivos (azure.yaml y el directorio infra) que generarán una arquitectura segura de forma predeterminada con los siguientes recursos de Azure:

    • Grupo de recursos → Contenedor de todos los recursos creados.
    • Plan de App Service → Define los recursos de proceso de App Service. Se especifica un plan de Linux en el nivel B1.
    • App Service → Representa su aplicación y se ejecuta en el plan de App Service.
    • Red virtual → Se integra con la aplicación App Service y aísla el tráfico de red de back-end.
    • Servidor flexible de Azure Database for PostgreSQL → Accesible solo desde la red virtual. Una base de datos y un usuario se crean automáticamente en el servidor.
    • Zona DNS privada → Habilita la resolución DNS del servidor de PostgreSQL en la red virtual.
    • Área de trabajo de Log Analytics → Actúa como contenedor de destino para que su aplicación envíe sus registros, donde también puede consultar los registros.

2. Uso de la cadena de conexión de base de datos

La plantilla azd que usa ya le ha generado las variables de conectividad como configuración de la aplicación y las envía al terminal para mayor comodidad. La configuración de la aplicación es una forma de mantener los secretos de conexión fuera del repositorio de código.

  1. En la salida azd, busque la configuración de la aplicación y visualice los ajustes AZURE_POSTGRESQL_CONNECTIONSTRING y AZURE_REDIS_CONNECTIONSTRING. Para mantener los secretos seguros, solo se muestran los nombres de configuración. Tienen este aspecto en la salida azd:

     App Service app has the following settings:
    
             - AZURE_POSTGRESQL_CONNECTIONSTRING
             - AZURE_REDIS_CONNECTIONSTRING
             - FLASK_DEBUG
             - SCM_DO_BUILD_DURING_DEPLOYMENT
             - SECRET_KEY
     
  2. AZURE_POSTGRESQL_CONNECTIONSTRING contiene la cadena de conexión a la base de datos de Postgres en Azure y AZURE_REDIS_CONNECTIONSTRING contiene la cadena de conexión a la memoria caché de Redis en Azure. Debe usarlos en el código para conectarse a él. Abra azureproject/production.py, quite la marca de comentario de las líneas siguientes y guarde el archivo:

    conn_str = os.environ['AZURE_POSTGRESQL_CONNECTIONSTRING']
    conn_str_params = {pair.split('=')[0]: pair.split('=')[1] for pair in conn_str.split(' ')}
    DATABASE_URI = 'postgresql+psycopg2://{dbuser}:{dbpass}@{dbhost}/{dbname}'.format(
        dbuser=conn_str_params['user'],
        dbpass=conn_str_params['password'],
        dbhost=conn_str_params['host'],
        dbname=conn_str_params['dbname']
    )
    

    El código de la aplicación ahora está configurado para conectarse a la base de datos postgreSQL en Azure. Si lo desea, abra app.py y vea cómo se usa la variable de entorno DATABASE_URI.

  3. En el terminal, ejecute azd deploy.

    azd deploy
    

4. Generación del esquema de la base de datos

Con la base de datos PostgreSQL protegida por la red virtual, la manera más fácil de ejecutar migraciones de base de datos de Flask es mediante una sesión SSH con el contenedor de App Service.

  1. En la salida azd, busque la dirección URL de la sesión SSH y vaya a ella en el explorador. Se parece a esto en la salida:

     Open SSH session to App Service container at: https://<app-name>.scm.azurewebsites.net/webssh/host
     
  2. En el terminal de SSH, ejecute flask db upgrade. Si se realiza correctamente, App Service se conecta a la base de datos.

    A screenshot showing the commands to run in the SSH shell and their output (Flask).

    Nota:

    Cuando la aplicación se reinicie, solo persisten los cambios realizados en los archivos ubicados en /home. Los cambios efectuados fuera de /home no se conservan.

5. Navegación hasta la aplicación

  1. En la salida azd, busque la dirección URL de la aplicación y vaya a ella en el explorador. La dirección URL tiene este aspecto en la salida de AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>.azurewebsites.net/
     
  2. Agregue algunos restaurantes a la lista.

    Enhorabuena, ya está ejecutando una aplicación web en Azure App Service, con conectividad protegida a Azure Database for PostgreSQL.

6. Transmisión de registros de diagnóstico

Azure App Service puede capturar registros de consola para ayudarle a diagnosticar problemas con la aplicación. Para mayor comodidad, la plantilla azd ya ha habilitado el registro en el sistema de archivos local, así como el envío a un área de trabajo de Log Analytics.

La aplicación de ejemplo incluye instrucciones print() para demostrar esta funcionalidad, como se muestra en el siguiente fragmento de código.

@app.route('/', methods=['GET'])
def index():
    print('Request for index page received')
    restaurants = Restaurant.query.all()
    return render_template('index.html', restaurants=restaurants)

En la salida azd, busque el vínculo para transmitir registros de App Service y vaya a él en el explorador. El vínculo tiene este aspecto en la salida azd:

Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream

Obtenga más información sobre cómo iniciar sesión en aplicaciones de Python en la serie sobre cómo configurar Azure Monitor para la aplicación Python.

7. Limpieza de recursos

Para eliminar todos los recursos de Azure en el entorno de implementación actual, ejecute azd down.

azd down

Solucionar problemas

A continuación se indican los problemas que pueden surgir al intentar trabajar con este tutorial y los pasos para resolverlos.

No puedo conectarme a la sesión de SSH

Si no puede conectarse a la sesión SSH, significa que no se pudo iniciar la propia aplicación. Compruebe los registros de diagnóstico para obtener más información. Por ejemplo, si ve un error como KeyError: 'AZURE_POSTGRESQL_CONNECTIONSTRING', puede significar que falta la variable de entorno (es posible que haya quitado el valor de configuración de la aplicación).

Recibo un error al ejecutar migraciones de base de datos

Si encuentra algún error relacionado con la conexión a la base de datos, compruebe si se han cambiado los valores de configuración de la aplicación (AZURE_POSTGRESQL_CONNECTIONSTRING). Sin esa cadena de conexión, el comando de migración no se puede comunicar con la base de datos.

Preguntas más frecuentes

¿Cuánto cuesta esta configuración?

Los precios por los recursos creados son los siguientes:

  • El plan de App Service se crea en el nivel Básico y puede escalar o reducirse verticalmente. Consulte Precios de App Service.
  • PostgreSQL, servidor flexible se crea en el nivel ampliable más bajo (Standard_B1ms), con el tamaño de almacenamiento mínimo, que se puede escalar o reducir verticalmente. Consulte los precios de Azure Database for PostgreSQL.
  • La red virtual no incurre en cargo alguno, a menos que se configure alguna funcionalidad extra, como, por ejemplo, el emparejamiento. Vea Precios de Azure Virtual Network.
  • La zona DNS privada conlleva un pequeño cargo. Vea Precios de Azure DNS.

¿Cómo me conecto al servidor de PostgreSQL protegido tras la red virtual con otras herramientas?

  • Para tener un acceso básico desde una herramienta de línea de comandos, puede ejecutar psql desde el terminal de SSH de la aplicación.
  • Para conectarse desde una herramienta de escritorio, la máquina debe estar en la red virtual. Por ejemplo, podría ser una máquina virtual de Azure conectada a una de las subredes, o una máquina de una red local que tenga una conexión VPN de sitio a sitio a la red virtual de Azure.
  • También puede integrar Azure Cloud Shell en la red virtual.

¿Cómo funciona el desarrollo de aplicaciones locales con Acciones de GitHub?

Tomando como ejemplo el archivo de flujo de trabajo generado automáticamente de App Service: cada git push inicia una nueva ejecución de compilación e implementación. Desde un clon local del repositorio de GitHub, realiza las actualizaciones deseadas y las inserta en GitHub. Por ejemplo:

git add .
git commit -m "<some-message>"
git push origin main

¿Cómo está configurado el ejemplo de Django para ejecutarse en Azure App Service?

Nota

Si sigue este tutorial con su propia aplicación, examine la descripción del archivo requirements.txt en el archivo README.md de cada proyecto (Flask, Django) para ver los paquetes que necesitará.

La aplicación de ejemplo de Django configura los valores en el archivo azureproject/production.py para que se pueda ejecutar en Azure App Service. Estos cambios son comunes a la implementación de Django en producción y no son específicos de App Service.

  • Django valida el encabezado HTTP_HOST en las solicitudes entrantes. El código de ejemplo usa la variable de entorno WEBSITE_HOSTNAME en App Service para agregar el nombre de dominio de la aplicación al valor de ALLOWED_HOSTS de Django.

    # Configure the domain name using the environment variable
    # that Azure automatically creates for us.
    ALLOWED_HOSTS = [os.environ['WEBSITE_HOSTNAME']] if 'WEBSITE_HOSTNAME' in os.environ else []
    
  • Django no admite servir archivos estáticos en producción. En este tutorial se usa WhiteNoise para permitir servir los archivos. El paquete WhiteNoise ya se instaló con requirements.txt y su middleware se ha agregado a la lista.

    
    # WhiteNoise configuration
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        # Add whitenoise middleware after the security middleware
        'whitenoise.middleware.WhiteNoiseMiddleware',
    

    Los valores del archivo estático se configuran según la documentación de Django.

    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    

Para obtener más información, consulte Configuración de producción para aplicaciones de Django.

Pasos siguientes

Pase al tutorial siguiente para aprender a proteger la aplicación con un dominio personalizado y un certificado.

Obtenga información sobre cómo App Service ejecuta una aplicación de Python: