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.
Para completar este tutorial, necesita:
- Una cuenta de Azure con una suscripción activa. Si no tiene una cuenta de Azure, puede crearla gratis.
- Conocimientos de Python con desarrollo de Flask o Python con desarrollo de Django
- Una cuenta de Azure con una suscripción activa. Si no tiene una cuenta de Azure, puede crearla gratis.
- Azure Developer CLI instalado. Puede seguir los pasos con Azure Cloud Shell porque ya tiene instalado Azure Developer CLI.
- Conocimientos de Python con desarrollo de Flask o Python con desarrollo de Django
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
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:
- Escriba "base de datos de aplicación web" en la barra de búsqueda de la parte superior de Azure Portal.
- Seleccione el elemento denominado Aplicación web + base de datos en el encabezado Marketplace. También puede ir directamente al asistente de creación.
Paso 2: In the páginaCrear aplicación web + base de datos, rellene el formulario de la siguiente manera.
- Grupo de recursos → seleccione Crear nuevo y use el nombre msdocs-python-postgres-tutorial.
- Región → Cualquier región de Azure cercana.
- Nombre → msdocs-python-postgres-XYZ, donde XYZ son tres caracteres aleatorios. Este nombre debe ser único en Azure.
- Pila en tiempo de ejecución → Python 3.10.
- Base de datos → PostgreSQL: 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.
- Plan de hospedaje → Básico. Cuando esté listo, puede escalar verticalmente a un plan de tarifa de producción más adelante.
- Seleccione Revisar + crear.
- Una vez completada la validación, seleccione Crear.
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.
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.
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.
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:
- Inicie sesión en su cuenta de GitHub.
- Vaya a https://github.com/Azure-Samples/msdocs-flask-postgresql-sample-app.
- Seleccione Bifurcación.
- Seleccione Crear bifurcación.
Paso 2: En la página de GitHub, abre Visual Studio Code en el navegador pulsando la tecla .
.
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.
Paso 4: De nuevo en la página App Service, en el menú de la izquierda, seleccione Centro de implementación.
Paso 5: En la página Centro de implementación:
- En Origen, seleccione GitHub. De forma predeterminada, Acciones de GitHub está seleccionado como proveedor de compilación.
- Inicie sesión en su cuenta de GitHub y siga las indicaciones para autorizar a Azure.
- En Organización, seleccione su cuenta.
- En Repositorio, seleccione msdocs-flask-postgresql-sample-app.
- En Rama, seleccione main.
- Mantenga la opción predeterminada seleccionada para Agregar un flujo de trabajo.
- En Tipo de autenticación, seleccione Identidad asignada por el usuario.
- 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
.
Paso 6: En la página Centro de implementación:
- Seleccione Registros. Ya hay iniciada una ejecución de implementación.
- En el elemento de registro de la ejecución de implementación, seleccione Compilar o implementar registros.
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.
¿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,
- Seleccione SSH.
- Seleccione Ir.
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.
5. Navegación hasta la aplicación
Paso 1. En la página App Service:
- En el menú de la izquierda, seleccione Información general.
- Seleccione la dirección URL de la aplicación. También puede navegar directamente a
https://<app-name>.azurewebsites.net
.
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.
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:
- En el menú de la izquierda, seleccione Registros de App Service.
- En Registro de aplicaciones, seleccione Sistema de archivos.
- En el menú superior, elija Guardar.
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.
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:
- Escriba el nombre del grupo de recursos.
- Seleccione el grupo de recursos.
Paso 2: En la página del grupo de recursos, seleccione Borrar grupo de recursos.
Paso 3:
- Escriba el nombre del grupo de recursos para confirmar la eliminación.
- Seleccione Eliminar.
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.
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.
Desde la raíz del repositorio, ejecute
azd init
.azd init --template python-app-service-postgresql-infra
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.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 comandoazd 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.
En la salida azd, busque la configuración de la aplicación y visualice los ajustes
AZURE_POSTGRESQL_CONNECTIONSTRING
yAZURE_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
AZURE_POSTGRESQL_CONNECTIONSTRING
contiene la cadena de conexión a la base de datos de Postgres en Azure yAZURE_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 entornoDATABASE_URI
.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.
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
En el terminal de SSH, ejecute
flask db upgrade
. Si se realiza correctamente, App Service se conecta a la base de datos.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
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/
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?
- ¿Cómo me conecto al servidor de PostgreSQL protegido tras la red virtual con otras herramientas?
- ¿Cómo funciona el desarrollo de aplicaciones locales con Acciones de GitHub?
- ¿Cómo está configurado el ejemplo de Django para ejecutarse en Azure App Service?
¿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: