Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

En esta primera entrega voy a centrarme en el desarrollo con Flask y en el deploy en Windows Server/IIS, dado que he visto en Internet y foros muchas consultas a problemas relacionados con el despliegue en esta plataforma y que espero abordar en este artículo

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask
Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Introducción

Para el funcionamiento de la app en Windows Server vamos a utilizar los siguientes componentes:

  • Python versión 3.12.2
  • PIP Versión 24.0
  • Internet Information Services (IIS)

Estas son las características que deberían instalarse en el Servidor Web para poder correr la app Flask, la más importante de todas ellas es la opción CGI en Application Development dado que Flask se montará usando el módulo FastCGI

Para la instalación de Python En Windows puede seguir el siguiente tutorial

Para la instalación de Python en Mac este otro tutorial

Desarrollo con Flask

Vamos a utilizar Visual Studio Code y una estructura de carpetas propuesta como estándar para acomodar todas las piezas relacionadas con el framework y con la infraestructura de la App Web. Además la estructura servirá de base para escalar a aplicaciones de corte empresarial

¿Cuáles son las ventajas de Flask frente a otros Frameworks como Django?

Partamos diciendo que Flask es un micro framework mientras que Django es un framework más completo o como algunos desarrolladores prefieren llamarlo “all inclusive o full”. Esto significa que Flask tiene más flexibilidad para elegir las herramientas que desea usar, mientras que Django tiene características más esenciales y listas para usar.

Flask y Django son gratuitos y de código abierto. Punto importante a la hora de elegir un framework

Ambos frameworks tienen una gran comunidad, documentación detallada y reciben actualizaciones periódicas. Punto importante a la hora de elegir un framework

El sistema de plantillas html de ambos frameworks es muy similar, de hecho, Jinja2 que es el framework de plantillas de Flask se construyó basado en el sistema de plantillas de Django

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask
https://blog.jetbrains.com/wp-content/uploads/2023/11/django-vs-jinja2-template.png

Ambos sistemas de plantilla son poderosos, a mi personalmente me gustan más los frameworks que me dan más libertad a la hora de innovar con ciertos aspectos como la extensibilidad o escalar el sistema de plantillas a nuevas funcionalidades, algo que Django es cerrado en algunos aspectos. Para un análisis más completo y detallado revisar el siguiente artículo publicado por JetBrains

Crear proyecto en Visual Studio Code

1.- Crear un directorio de trabajo para el proyecto en el Escritorio. Yo estoy trabajando en Mac pero los comandos pueden ejecutarse en el Git-bash o un CMD en Windows

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

2.- Abrir visual studio code en el directorio creado y continuar trabajando en el terminal integrado de VS (code .)

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

3.- Crear un entorno virtual de trabajo para el proyecto Flask y activarlo

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

4.- Actualizar pip en el entorno virtual de trabajo

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

5.- Instalar el paquete del framework Flask con todas sus dependencias (por ejemplo Jinja2)

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

6.- Crear estructura de directorios y archivos de la app

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

app: directorio donde configuraremos nuestra aplicación Flask y eventualmente extender a otras funcionalidades

static: directorio para los archivos estáticos como las imágenes, los CSS, los JS, los frameworks HTML, etc

templates: directorio donde se almacenarás las plantillas html del proyecto Flask

7.- Modificaremos el archivo serve.py para agregarle el contenido básico, el archivo tiene la lógica para el servidor de desarrollo web local de nuestra app

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

“from app” significa que está importando algo desde el directorio app de nuestra aplicación (que lo hemos creado pero vacío por el momento), el host donde se ejecutará la app y el puerto. Host podría ser 127.0.0.1 y port cualquier puerto libre en el equipo donde estemos trabajando

8.- En el directorio app creamos un archivo llamado __init__.py con el siguiente contenido

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Línea 1: importamos Flask

Línea 3: creamos un método que retornará la app de Flask creada, dentro del método se define el nombre de la app que por defecto es __name__ que es el nombre del módulo actual de Python. La aplicación necesita saber dónde se encuentra para establecer algunas rutas, y __name__ es una forma conveniente de decírselo. Referencia

Luego de __name__ se definen la ruta donde se almacenarán las plantilla (templates), la ruta para los archivos estáticos (static) y static_url_path que se puede utilizar para especificar una ruta diferente para los archivos static en la web. El valor predeterminado es el nombre de la carpeta static_folder. Referencia

Finalmente se retorna la app (línea 13)

9.- Ejecutamos el proyecto como está

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Esto levanta un servidor web de desarrollo en el host y puerto que definimos en el archivo serve.py, abrimos un navegador en la URL indicada:

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Como no hay ninguna ruta definida retorna Not Found (“/” no existe)

10.- Creamos una ruta en el directorio routes dentro de app y dentro de routes una carpeta llamada pages (ustedes pueden definir su propia convención de nombres)

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

En el directorio pages vamos a crear un archivo llamado main.py con el siguiente contenido:

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Línea 2: importación de módulos necesarios de Flask (para entender bien lo que es un Blueprint)

Línea 4: contiene el módulo principal de la aplicación correspondiente a la ruta base (“/”)

Línea 6: se define la ruta con un método llamado home_route y retorna el template correspondiente

11.- Creamos el blueprint para pages dentro del archivo __init__ en la ruta pages que use este BP principal

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

12.- Creamos el template definido en el BP de main.py

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Y dentro de home un html sencillo

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

13.- Ahora dentro de la carpeta routes ponemos otro __init__.py para importar pages

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

14.- Importamos todo desde el __init__ de la carpeta app

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

15.- Detenemos el servidor de desarrollo (CTRL+c) y lo ejecutamos nuevamente (en rigor los cambios se actualizan en vivo). Luego actualizamos el navegador

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Ahora aparece desplegada nuestra ruta principal y terminamos el desarrollo de esta app sencilla usando Flask, para profundizar en el desarrollo recomiendo que sigan la documentación oficial y la serie de tutoriales que son propuestos.

Paso a producción en IIS usando FastCGI

Antes de pasar el fuente a productivo vamos a exportar la lista de paquetes para realizar la misma instalación en el ambiente remoto

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Con esto se creará un archivo llamado reqs.txt en la raíz del proyecto donde se indican todos los paquetes instalados

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Luego lo que haremos es copiar el código (carpeta flask-app-test) al servidor o en su defecto subirlo a algún repositorio de GIT y clonarlo en la máquina remota

En el servidor remoto debe tener instalado Python y PIP tal y como se hizo con el desarrollo

En el servidor Windows Server

Se recomienda crear una carpeta dentro de c:\inetpub para tener el proyecto Flask, en mi caso he creado una carpeta llamada wwwFlask y dentro de ella he copiado la carpeta con el código fuente del proyecto de prueba

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Luego lo que haremos es crear el sitio web en IIS usando la siguiente configuración. La ruta debe ser el path creado anteriormente dentro de wwwFlask y el puerto en mi caso voy a utilizar el 9091

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Realizamos la instalación de los paquetes con PIP en el servidor de la misma forma como se hizo en el desarrollo pero esta vez usando el archivo reqs.txt que exportamos en el primer paso

pip install -r reqs.txt
Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Adicionalmente a esta lista de paquetes para el proyecto Flask necesitamos la librería wfastcgi (en mi caso ya está instalada la librería)

pip install wfastcgi
Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Luego de instalada la librería debemos habilitarla con el siguiente comando:

wfastcgi-enable

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

El sistema crea una ruta al ejecutable de Python junto con el argumento para ejecutar Flask como un módulo CGI, esta ruta completa debe guardarse porque a continuación vamos a crear un archivo web.config dentro del directorio del proyecto. El path puede variar dependiendo de donde tengan instalado Python, se recomienda de todas formas instalar Python en un directorio sin espacios para evitar problemas y errores posteriores

Creación del archivo web.config para el proyecto

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Python FlaskCGI corresponde al módulo de IIS para ejecutar el script como CGI, también puede configurarse a través del administrador de IIS de la siguiente forma:

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Luego damos click en asignaciones de controlador

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Para que el módulo FastCGIModule aparezca dentro de la lista de opciones debe instalar CGI como componentes de IIS (dentro de la sección Application Development)

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

Finalmente toda vez que se creo el web.config dentro del proyecto procedemos a reiniciar el sitio web y probar en el puerto asignado

Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

El código fuente de la app completa con toda la configuración lo he dejado en github

Visited 58 times, 1 visit(s) today
Please follow and like us:
Desarrollo y deploy de una App Web en IIS utilizando Python con Flask
Desarrollo y deploy de una App Web en IIS utilizando Python con Flask
Desarrollo y deploy de una App Web en IIS utilizando Python con Flask
Desarrollo y deploy de una App Web en IIS utilizando Python con Flask
Desarrollo y deploy de una App Web en IIS utilizando Python con Flask

2 thoughts on “Desarrollo y deploy de una App Web en IIS utilizando Python con Flask”

    • Hola

      El __init__ dentro de la carpeta routes lo que hace es importar el BP creado en el punto #11, sino está creado el pages_bp dará error de importación

      Saludos

      Responder

Leave a Comment

URL has been copied successfully!
URL has been copied successfully!
RSS
Follow by Email
Facebook
X (Twitter)
Visit Us
Follow Me
Tweet
Youtube
Youtube
Whatsapp
Reddit
Copy link