Comparteix a través de


Configuración de aplicaciones web de Python para IIS

Al usar Internet Information Services (IIS) como servidor web en un equipo Windows (incluidas 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 configurar las opciones necesarias.

Prerrequisitos

  • Python ha sido instalado en Windows. Para ejecutar una aplicación web, instale primero la versión necesaria de Python directamente en el equipo host de Windows, tal como se describe en Instalación de intérpretes de Python.

    • Identifique la ubicación del intérprete de 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, puedes instalar todos los requisitos de la aplicación en el entorno global ejecutando 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 de Python indica al servidor web IIS (versión 7 o posterior) que se ejecuta en Windows sobre cómo debe controlar las solicitudes de Python a través de HttpPlatformHandler (recomendado) o FastCGI. Las versiones de Visual Studio 2015 y anteriores realizan estas modificaciones automáticamente. Para Visual Studio 2017 y versiones posteriores, debe modificar manualmente el archivo web.config.

Si el proyecto aún no contiene un archivo de 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 de web.config en blanco.

Opción 1: Configurar HttpPlatformHandler

El módulo HttpPlatform pasa conexiones de socket directamente a un proceso independiente de Python. Este paso a través le permite ejecutar cualquier servidor web que desee, pero requiere un script de inicio que ejecute un servidor web local. Este enfoque se suele realizar mediante un marco 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.pyy 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 contiene el puerto en el que el servidor local debe escuchar las conexiones desde localhost. En este ejemplo también se muestra cómo crear otra variable de entorno, SERVER_PORT. Puede crear y asignar variables de entorno según sea necesario.

Opción 2: Configurar el 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 varios procesos persistentes de Python.

Nota

Aunque puede configurar el proyecto con FastCGI, se recomienda usar HttpPlatformHandler para configurar las aplicaciones, ya que el proyecto de WFastCGI ya no se mantiene y puede producir errores.

Para usar FastCGI, primero instale y configure el paquete wfastcgi 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 archivo ejecutable de python.exe y al archivo wfastcgi.py de la clave PythonHandler. En los pasos siguientes se supone que Python está instalado en la carpeta c:\python36-32 y el código de la aplicación se encuentra en la carpeta c:\home\site\wwwroot. Ajuste estos valores para tus rutas 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" ( 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>
    
  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 <appSettings> están disponibles para la aplicación como variables de entorno:

    • El valor de la clave PYTHONPATH se puede extender libremente, pero debe incluir la raíz de la aplicación.
    • La clave de 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 tu aplicación.
  3. Establezca la entrada WSGI_HANDLER en el archivo web.config según corresponda para el marco que usa:

    • Botella: Agregue paréntesis después del valor de 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 de WSGI_HANDLER a <project_name>.app donde <project_name> coincida con el nombre del proyecto. Puede encontrar el identificador exacto examinando la instrucción from <project_name> import app en el archivo runserver.py. Por ejemplo, si el proyecto se denomina FlaskAzurePublishExample, la entrada aparece de la siguiente manera:

      <!-- Flask apps only: Change the project name to match your app -->
      <add key="WSGI_HANDLER" value="FlaskAzurePublishExample.app"/>
      
    • de Django: se necesitan dos cambios en el archivo web.config para proyectos de Django.

      • Cambie el valor de WSGI_HANDLER a 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 siguiente entrada 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, añada el dominio del sitio o la dirección IP a la entrada de 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, verá 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, no se permitirá automáticamente el acceso a estos sitios host. Por este motivo, es posible que desee mantener copias independientes de desarrollo y producción del archivo settings.py o usar variables de entorno para controlar los valores en tiempo de ejecución.

Implementación en IIS o en una máquina virtual Windows

Cuando tenga el archivo de web.config correcto en su proyecto, puede publicar en el equipo que está ejecutando IIS desde Explorador de soluciones. Haga clic con el botón derecho en el proyecto, seleccione Publicary, 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 servidor.