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.
  • 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 HttpPlatform, el módulo principal de ASP.NET o FastCGI. 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.

Configuración del controlador del módulo principal de ASP.Net

El módulo principal de ASP.NET facilita la transferencia directa de conexiones de socket a un proceso independiente de Python. Este enfoque ofrece la flexibilidad de usar cualquier servidor web que se prefiera, aunque requiere un script de inicio responsable de iniciar un servidor web local, normalmente aprovechando un marco web de Python como Flask o Django. Dentro del archivo web.config, este script se define dentro del elemento <aspNetCore>. Aquí, el atributo processPath designa el intérprete de Python asociado a la extensión del sitio, mientras que el atributo arguments especifica el script de inicio elegido, como runserver.py, junto con los argumentos deseados.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="PythonHandler" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="c:\python36-32\python.exe"
                  arguments="c:\home\site\wwwroot\runserver.py"
                  stdoutLogEnabled="true"
                  stdoutLogFile="c:\home\LogFiles\python.log"
                  startupTimeLimit="60"
                  processesPerApplication="16">
      <environmentVariables>
        <environmentVariable name="SERVER_PORT" value=".." />
      </environmentVariables>
    </httpPlatform>
  </system.webServer>
</configuration>

Para obtener más información sobre los archivos web.config de ASP.NET, consulte Archivo de configuración web.config de IIS de ASP.NET.

Configuración del controlador de HttpPlatform

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.

Configuración del controlador FastCGI

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:

Se recomienda usar HttpPlatform o el Módulo principal de ASP.NET para configurar las aplicaciones, ya que el proyecto WFastCGI ya no se mantiene.

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.

  1. Modifique la entrada PythonHandler en el archivo web.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.

    <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>
    
  2. En la sección <appSettings> del archivo web.config, agregue claves para WSGI_HANDLER, WSGI_LOG (opcional) y PYTHONPATH:

    <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.
  3. Establezca la entrada WSGI_HANDLER en el archivo web.config de forma adecuada para el marco de trabajo 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. Puede ver la sintaxis en el archivo app.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ón from <project_name> import app en el archivo runserver.py. Por ejemplo, si el proyecto se denominara FlaskAzurePublishExample, 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 por django.core.wsgi.get_wsgi_application(). El objeto está en el archivo wsgi.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 valor DjangoAzurePublishExample por el nombre del proyecto:

        <add key="DJANGO_SETTINGS_MODULE" value="django_iis_example.settings" />
        
  4. 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 entrada ALLOWED_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 desee 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.