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
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
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
2.- Abrir visual studio code en el directorio creado y continuar trabajando en el terminal integrado de VS (code .)
3.- Crear un entorno virtual de trabajo para el proyecto Flask y activarlo
4.- Actualizar pip en el entorno virtual de trabajo
5.- Instalar el paquete del framework Flask con todas sus dependencias (por ejemplo Jinja2)
6.- Crear estructura de directorios y archivos de la app
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
“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
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á
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:
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)
En el directorio pages vamos a crear un archivo llamado main.py con el siguiente contenido:
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
12.- Creamos el template definido en el BP de main.py
Y dentro de home un html sencillo
13.- Ahora dentro de la carpeta routes ponemos otro __init__.py para importar pages
14.- Importamos todo desde el __init__ de la carpeta app
15.- Detenemos el servidor de desarrollo (CTRL+c) y lo ejecutamos nuevamente (en rigor los cambios se actualizan en vivo). Luego actualizamos el navegador
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
Con esto se creará un archivo llamado reqs.txt en la raíz del proyecto donde se indican todos los paquetes instalados
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
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
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
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
Luego de instalada la librería debemos habilitarla con el siguiente comando:
wfastcgi-enable
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
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:
Luego damos click en asignaciones de controlador
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)
Finalmente toda vez que se creo el web.config dentro del proyecto procedemos a reiniciar el sitio web y probar en el puerto asignado
El código fuente de la app completa con toda la configuración lo he dejado en github
Hola el paso 13 que realizas no lo comprendo ese page de donde viene, es que en mi caso me da error al importarlo como tu.
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