Configuración de aplicaciones web de Python para IIS
Cuando se usa Internet Information Services (IIS) como servidor web en un equipo Windows (incluidas las máquinas virtuales Windows en Azure), debe configurar la aplicación web de Python para permitir que IIS procese correctamente el código de Python. La configuración se realiza a través de la configuración del archivo web.config
para la aplicación web de Python. En este artículo se describe cómo establecer la configuración necesaria.
Requisitos previos
Python instalado en Windows. Para ejecutar una aplicación web, primero debe instalar la versión necesaria de Python directamente en la máquina host Windows, tal como se describe en Instalación de intérpretes de Python.
- Identifique la ubicación del intérprete
python.exe
. Para mayor comodidad, puede agregar esa ubicación a la variable de entorno PATH.
- Identifique la ubicación del intérprete
Paquetes necesarios instalados. Para un host dedicado, puede usar el entorno global de Python para ejecutar la aplicación en lugar de un entorno virtual. En consecuencia, para instalar todos los requisitos de la aplicación en el entorno global, ejecute el comando
pip install -r requirements.txt
.
Configuración de web.config para que apunte al intérprete de Python
El archivo web.config
de la aplicación Python indica al servidor web de IIS (versión 7 o posterior) que se ejecuta en Windows el modo en que debe administrar las solicitudes de Python a través de FastCGI o HttpPlatformHandler (recomendado). Visual Studio 2015 y versiones anteriores realizan automáticamente estas modificaciones. Para Visual Studio 2017, debe modificar manualmente el archivo web.config
.
Si el proyecto aún no contiene un archivo web.config
, puede agregar uno haciendo clic con el botón derecho en el directorio del proyecto, seleccionando Agregar > Nuevo elemento y buscando web.config
o creando un archivo XML web.config
en blanco.
Opción 1: Configuración de HttpPlatformHandler
El módulo HttpPlatform pasa conexiones de socket directamente a un proceso de Python independiente. Este tránsito le permite ejecutar cualquier servidor web que quiera, pero necesita un script de inicio que ejecute un servidor web local. Este enfoque se suele realizar mediante un marco de trabajo web de Python, como Flask o Django. Especifique el script en el elemento <httpPlatform>
del archivo web.config
. El atributo processPath
apunta al intérprete de Python de la extensión de sitio. El atributo arguments
apunta al script de inicio que ejecuta un servidor web local, en este caso runserver.py
, y los argumentos que quiera proporcionar:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="PythonHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
</handlers>
<httpPlatform processPath="c:\python36-32\python.exe"
arguments="c:\home\site\wwwroot\runserver.py --port %HTTP_PLATFORM_PORT%"
stdoutLogEnabled="true"
stdoutLogFile="c:\home\LogFiles\python.log"
startupTimeLimit="60"
processesPerApplication="16">
<environmentVariables>
<environmentVariable name="SERVER_PORT" value="%HTTP_PLATFORM_PORT%" />
</environmentVariables>
</httpPlatform>
</system.webServer>
</configuration>
En este ejemplo, la variable de entorno HTTP_PLATFORM_PORT
que se muestra en el código contiene el puerto en el que debe escuchar su servidor local para las conexiones del localhost
. Este ejemplo también muestra cómo crear otra variable de entorno, SERVER_PORT
. Puede crear y asignar variables de entorno según sea necesario.
Opción 2: Configuración del controlador FastCGI
Como alternativa, puede usar FastCGI para configurar las aplicaciones. FastCGI es una interfaz que funciona en el nivel de solicitud. IIS recibe conexiones entrantes y reenvía cada solicitud a una aplicación WSGI que se ejecuta en uno o más procesos de Python persistentes.
Nota:
Aunque puede configurar el proyecto con FastCGI, se recomienda usar HttpPlatformHandler para configurar las aplicaciones, ya que el proyecto WFastCGI ya no se mantiene y puede producir errores.
Para usar FastCGI, primero instale y configure el paquete wfastcgi, tal y como se describe en pypi.org/project/wfastcgi/.
A continuación, modifique el archivo web.config
de la aplicación para incluir las rutas de acceso completas al ejecutable python.exe
y al archivo wfastcgi.py
en la clave PythonHandler
. En los pasos siguientes se presupone que Python está instalado en la carpeta c:\python36-32 y que el código de la aplicación está en la carpeta c:\home\site\wwwroot. Ajuste estos valores para las rutas de acceso según corresponda.
Modifique la entrada
PythonHandler
en el archivoweb.config
para que la ruta de acceso coincida con la ubicación de instalación de Python. Para obtener más información, consulte Referencia de configuración de IIS (iis.net).<system.webServer> <handlers> <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule" scriptProcessor="c:\python36-32\python.exe|c:\python36-32\wfastcgi.py" resourceType="Unspecified" requireAccess="Script"/> </handlers> </system.webServer>
En la sección
<appSettings>
del archivoweb.config
, agregue claves paraWSGI_HANDLER
,WSGI_LOG
(opcional) yPYTHONPATH
:<appSettings> <add key="PYTHONPATH" value="c:\home\site\wwwroot"/> <!-- The handler here is specific to Bottle; see the next section. --> <add key="WSGI_HANDLER" value="app.wsgi_app()"/> <add key="WSGI_LOG" value="c:\home\LogFiles\wfastcgi.log"/> </appSettings>
Estos valores de
<appSettings>
están disponibles para la aplicación como variables de entorno:- El valor de la clave
PYTHONPATH
puede ampliarse libremente, pero debe incluir la raíz de la aplicación. - La clave
WSGI_HANDLER
debe apuntar a una aplicación WSGI que se pueda importar desde la aplicación. - La clave
WSGI_LOG
es opcional, pero se recomienda para depurar la aplicación.
- El valor de la clave
Establezca la entrada
WSGI_HANDLER
en el archivoweb.config
de forma adecuada para el marco que esté usando:Bottle: agregue paréntesis después del valor
app.wsgi_app
como se muestra en este ejemplo. Los paréntesis son necesarios porque el objeto es una función en lugar de una variable. Puedes ver la sintaxis en el archivoapp.py
.<!-- Bottle apps only --> <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
Flask: cambie el valor
WSGI_HANDLER
por<project_name>.app
, donde<project_name>
coincide con el nombre del proyecto. Para encontrar el identificador exacto, examine la instrucciónfrom <project_name> import app
en el archivorunserver.py
. Por ejemplo, si el proyecto se denominaraFlaskAzurePublishExample
, la entrada aparcería así:<!-- Flask apps only: Change the project name to match your app --> <add key="WSGI_HANDLER" value="FlaskAzurePublishExample.app"/>
Django: se requieren dos cambios en el archivo
web.config
para los proyectos de Django.Cambie el valor
WSGI_HANDLER
pordjango.core.wsgi.get_wsgi_application()
. El objeto está en el archivowsgi.py
.<!-- Django apps only --> <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()"/>
Agregue la entrada siguiente inmediatamente después de la entrada de la clave
WSGI_HANDLER
. Reemplace el valorDjangoAzurePublishExample
por el nombre del proyecto:<add key="DJANGO_SETTINGS_MODULE" value="django_iis_example.settings" />
Solo aplicaciones de Django: en el archivo
settings.py
del proyecto de Django, agregue el dominio de la dirección URL o la dirección IP del sitio a la entradaALLOWED_HOSTS
. Reemplace "1.2.3.4" por su dirección URL o dirección IP:# Change the URL or IP address to your specific site ALLOWED_HOSTS = ['1.2.3.4']
Si no agrega la dirección URL a los resultados de la matriz, se mostrará el siguiente error:
DisallowedHost at / Invalid HTTP_HOST header: '\<site URL\>'. You might need to add '\<site URL\>' to ALLOWED_HOSTS.
Cuando la matriz está vacía, Django permite automáticamente 'localhost'
y '127.0.0.1'
como hosts. Si agrega la dirección URL de producción, estos sitios host no se permiten automáticamente. Por este motivo, puede que quiera mantener copias de desarrollo y producción independientes del archivo settings.py
, o bien usar variables de entorno para controlar los valores de tiempo de ejecución.
Implementación en una máquina virtual IIS o Windows
Cuando tenga el archivo web.config
correcto en el proyecto, puede publicar en el equipo que ejecuta IIS desde el Explorador de soluciones. Haga clic con el botón derecho en el proyecto, seleccione Publicar y, a continuación, seleccione IIS, FTP, etc. En esta situación, Visual Studio copia solo los archivos del proyecto en el servidor. Usted es responsable de toda la configuración del lado del servidor.