Noe Nieto

Mi sitio personal | Personal site

Hola mundo de Flask en IIS 8.5 (Windows 10)

Guía completa para desplegar aplicaciones Flask en IIS 8.5 (Windows 10) usando FastCGI, wfastcgi y Visual Studio con PTVS.

Intro

Tuve el chance de probar Flask y echarlo a funcionar en IIS 8.5.

Instalar Visual Studio (VS) y Python Tools for Visual Studio

Cuando escribí este artículo, la última versión disponible era Visual Studio 2013 (VS) edición community. Lo descargué de http://www.visualstudio.com/.

Después de instalar VS se instala el add-on Python Tools for Visual Studio (PTVS).

PTVS trae algunas plantillas de proyectos bastante útiles. Una de ellas es la plantilla para un sitio basado en Flask.

Abre VS y selecciona: FileNewProject. En la ventana de diálogo, en el panel de la izquierda, selecciona InstalledTemplatesPythonWeb y finalmente Flask Web Project en el panel central. Click Ok para crear el proyecto.

Nuevo proyecto Flask — click en OK para guardar el proyecto

Instalar Python

Para poder probar el sitio Flask es necesario un intérprete de Python. Obviamente Windows no trae uno y hay que instalarlo desde la web de Python www.python.org.

Instalador de Python — Next, Next, Next... zzz

Instalar Python en Windows es bastante sencillo. Hay que bajar el instalador, abrirlo y pulsar el botón Next del asistente hasta que tengamos la confirmación de que la instalación ha concluido. La versión instalada es Python 3.4.2 de 32 bits.

Configurar el entorno virtual

La mejor manera de configurar el entorno virtual es mediante Solution Explorer.

Nuevo entorno virtual. Seleccionar Add Virtual Environment

Luego hay que hacer click con el botón derecho del mouse en FlaskWebProject1Python Environments y seleccionar la opción Add Virtual Environment. En la ventana de diálogo rellena los campos con los siguientes valores:

  • Location of the virtual environment: Flask
  • Select an interpreter: Python 3.4
  • Download and install packages: Activado

Luego solo falta picar en el botón Create.

Solo falta picar en el botón Create

Tras bambalinas VS (bueno, en realidad es PTVS) creará el entorno virtual y lo activará (lo que equivale al mkvirtualenv en Linux/Unix/Mac) y después instalará todas las dependencias listadas en requirements.txt, lo cual equivale al comando pip install -r requirements.txt. Al terminar este proceso verás que el entorno virtual llamado Flask ya se encuentra listado en Solution Explorer.

Virtualenv Activado

Probando Flask en modo depuración

En VS solo será necesario hacer click en el botón de debug para arrancar el pequeño servidor integrado de Flask.

Botón para arrancar Flask en modo debug

VS lanzará un intérprete de Python (para ser exactos: el Python.exe del entorno virtual Flask), correrá runserver.py y cuando termine de arrancar abrirá una ventana de Firefox (en mi caso) para que cargue el sitio.

Y aquí está la prueba: Flask corriendo en Windoge

Ahora que corra en IIS

En un artículo anterior describí cómo instalar IIS 8.5 en Windoze 10. Ahora voy a describir cómo instalar la aplicación de Flask en IIS. Primero hay que instalar el Web Platform Installer. Este se descarga desde http://www.microsoft.com/web/downloads/platform.aspx. El proceso de instalación es bastante similar a cualquier otro software.

Ya instalado el Web Platform Installer hay que abrirlo e instalar WFastCGI Gateway for IIS and Python.

Buscar Python en el Web Platform Installer

Seleccioné WFastCGI 2.1 Gateway for IIS and Python 3.4 y le piqué al botón Add. Con eso se habilitó el botón Install (en la esquina inferior derecha). Al picarle al botón se abrió una ventana modal con pasos. En el primer paso se informa de los prerequisitos. Yo le piqué en I Accept.

I accept

El segundo paso es la instalación.

Proceso

Hay que esperar a que descargue Python y otras cosas.

Así termina

Nota: Parece que el Web Installer detectó que existía una instalación de Python 3, pero no estoy seguro. Pero de lo que sí estoy seguro es de que instaló un script (wfastcgi.py) en C:\Python34\Scripts\wfastcgi.py.

El script de WFastCGI

¿Y qué es FastCGI? Es CGI pero con algunas extensiones. El script wfastcgi.py es una pasarela entre FastCGI de IIS y el protocolo WSGI en las aplicaciones Python.

Instalar FastCGI en IIS

En lugar de copiar y pegar los comandos con Package Manager intentaré innovar un poquito y usar DISM en su lugar, ya que parece que es la más nueva tecnología para agregar características a un Windows.

Por ejemplo, para ver el status del módulo IIS-CGI:

Dism /online /Get-FeatureInfo /FeatureName:IIS-CGI

Y sale esto:

Usando DISM para saber el estatus de una característica de Windoge

El comando para instalar el CGI de IIS es:

Dism /online /Enable-Feature /FeatureName:IIS-CGI

Ahora comienzo a pensar que me pude ahorrar tantos screenshots del proceso de instalación y hacerlo desde la línea de comandos. pff!

Instalación de característica IIS-CGI

Ahemmm... De regreso a lo que estaba haciendo...

Ahora es momento de usar appcmd para configurar todo el pipeline de FastCGI mediante Python en IIS. Por comodidad primero cambiamos el directorio para no tener que escribir toda la ruta a appcmd.exe.

cd c:\Windows\System32\inetsrv\

Registrar el manejador de FastCGI a nivel servidor.

appcmd set config /section:system.webServer/fastCGI "/+[fullPath='C:\Python34\python.exe', arguments='C:\Python34\Scripts\wfastcgi.py']"

Nota: Si te sale un error muy feo como el de abajo significa que ya estaba configurado.

ERROR ( message:New application object missing required attributes. Cannot add duplicate collection entry of type 'application' with combined key attributes 'fullPath, arguments' respectively set to 'C:\Python34\python.exe, C:\Python34\Scripts\wfastcgi.py' )

Ahora es momento de registrar/activar el módulo FastCGI:

appcmd set config /section:system.webServer/handlers "/+[name='Python_via_FastCGI',path='*',verb='*',modules='FastCgiModule',scriptProcessor='c:\Python34\python.exe|C:\Python34\Scripts\wfastcgi.py',resourceType='Unspecified']"

Configura el Python path para que use Flask:

appcmd set config -section:system.webServer/fastCgi /+"[fullPath='C:\Python34\python.exe', arguments='C:\Python34\Scripts\wfastcgi.py'].environmentVariables.[name='PYTHONPATH',value='C:\inetpub\apps\Flask']" /commit:apphost

Ahora hay que decirle al módulo de FastCGI el handler de WSGI.


Referencias:

FIN