Configuración de aplicaciones web de Python para IISConfigure Python web apps for IIS

Cuando se usa Internet Information Services (IIS) como servidor web en un equipo Windows (incluidas máquinas virtuales Windows en Azure, las aplicaciones de Python deben incluir una configuración específica en sus archivos web.config para que IIS pueda procesar correctamente el código Python.When using Internet Information Services (IIS) as a web server on a Windows computer (including Windows virtual machines on Azure, Python apps must include specific settings in their web.config files so that IIS can properly process Python code. El equipo mismo también debe tener instalado Python junto con cualquier paquete que la aplicación web necesite.The computer itself must also have Python installed along with any packages the web app requires.

Nota

Anteriormente, este artículo contenía guías para la configuración de Python en Azure App Service en Windows.This article previously contained guidance for configuring Python on Azure App Service on Windows. Las extensiones de Python y los hosts de Windows que se usaban en ese escenario quedaron en desuso a favor de Azure App Service en Linux.The Python extensions and Windows hosts used in that scenario have been deprecated in favor of Azure App Service on Linux. Para más información, consulte Publicación de una aplicación de Python en Azure App Service (Linux).For more information, see Publishing Python Apps to Azure App Service (Linux). Sin embargo, todavía puede encontrar el artículo anterior en Configuración de un entorno de Python en Azure App Service.The previous article, however, is still available on Managing App Service on Windows with the Python extensions.

Instalación de Python en WindowsInstall Python on 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.To run a web app, first install your required version of Python directly on the Windows host machine as described on Install Python interpreters.

Anote la ubicación del intérprete python.exe para pasos posteriores.Record the location of the python.exe interpreter for later steps. Para mayor comodidad, puede agregar esa ubicación a la variable de entorno PATH.For convenience, you can add that location to your PATH environment variable.

Instalar paquetesInstall packages

Cuando se usa un host dedicado, puede usar el entorno global de Python para ejecutar la aplicación en lugar de un entorno virtual.When using a dedicated host, you can use the global Python environment to run your app rather than a virtual environment. En consecuencia, para instalar todos los requisitos de la aplicación en el entorno global, simplemente ejecute pip install -r requirements.txt en un símbolo del sistema.Accordingly, you can install all of your app's requirements into the global environment simply by running pip install -r requirements.txt at a command prompt.

Configuración de web.config para que apunte al intérprete de PythonSet web.config to point to the Python interpreter

El archivo web.config de la aplicación indica al servidor web de IIS (7+) que se ejecuta en Windows el modo en que debe administrar las solicitudes de Python a través de FastCGI o HttpPlatform (recomendado).Your app's web.config file instructs the IIS (7+) web server running on Windows about how it should handle Python requests through either HttpPlatform (recommended) or FastCGI. Visual Studio 2015 y versiones anteriores realizan automáticamente estas modificaciones.Visual Studio versions 2015 and earlier make these modifications automatically. Al usar Visual Studio 2017, debe modificar manualmente el archivo web.config.When using Visual Studio 2017 and later, you must modify web.config manually.

Configuración del controlador de HttpPlatformConfigure the HttpPlatform handler

El módulo HttpPlatform pasa conexiones de socket directamente a un proceso de Python independiente.The HttpPlatform module passes socket connections directly to a standalone Python process. Ese paso a través le permite ejecutar cualquier servidor web que quiera, pero necesita un script de inicio que ejecute un servidor web local.This pass-through allows you to run any web server you like, but requires a startup script that runs a local web server. Especifique el script en el elemento <httpPlatform> de web.config, donde el atributo processPath apunta al intérprete de Python de la extensión de sitio y el atributo arguments, a su script y a cualquier argumento que quiera proporcionar:You specify the script in the <httpPlatform> element of web.config, where the processPath attribute points to the site extension's Python interpreter and the arguments attribute points to your script and any arguments you want to provide:

<?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>

La variable de entorno HTTP_PLATFORM_PORT que se muestra aquí contiene el puerto en el que debe escuchar su servidor local para las conexiones del localhost.The HTTP_PLATFORM_PORT environment variable shown here contains the port that your local server should listen on for connections from localhost. Este ejemplo también muestra cómo crear otra variable de entorno (si se quiere), que en este caso es SERVER_PORT.This example also shows how to create another environment variable, if desired, in this case SERVER_PORT.

Configuración del controlador FastCGIConfigure the FastCGI handler

FastCGI es una interfaz que funciona en el nivel de solicitud.FastCGI is an interface that works at the request level. 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.IIS receives incoming connections and forwards each request to a WSGI app running in one or more persistent Python processes.

Para usarlo, primero instale y configure el paquete wfastcgi como se describe en pypi.org/project/wfastcgi/.To use it, first install and configure the wfastcgi package as described on pypi.org/project/wfastcgi/.

A continuación, modifique el archivo web.config para incluir las rutas de acceso completas a python.exe y wfastcgi.py en la clave PythonHandler.Next, modify your app's web.config file to include the full paths to python.exe and wfastcgi.py in the PythonHandler key. En los pasos que aparecen a continuación, se supone que Python está instalado en c:\python36-32 y que el código de aplicación se encuentra en c:\home\site\wwwroot, por lo que debe ajustar las rutas de acceso según corresponda:The steps below assume that Python is installed in c:\python36-32 and that your app code is in c:\home\site\wwwroot; adjust for your paths accordingly:

  1. Modifique la entrada PythonHandler en web.config para que la ruta de acceso coincida con la ubicación de instalación de Python (consulte Referencia de configuración de IIS (iis.net) para ver los detalles exactos).Modify the PythonHandler entry in web.config so that the path matches the Python install location (see IIS Configuration Reference (iis.net) for exact details).

    <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:Within the <appSettings> section of web.config, add keys for WSGI_HANDLER, WSGI_LOG (optional), and 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:These <appSettings> values are available to your app as environment variables:

    • El valor de PYTHONPATH puede ampliarse libremente, pero debe incluir la raíz de la aplicación.The value for PYTHONPATH may be freely extended but must include the root of your app.
    • WSGI_HANDLER debe apuntar a una aplicación WSGI que se pueda importar desde la aplicación.WSGI_HANDLER must point to a WSGI app importable from your app.
    • WSGI_LOG es opcional, pero es recomendable para depurar la aplicación.WSGI_LOG is optional but recommended for debugging your app.
  3. Establezca la entrada WSGI_HANDLER en web.config de forma adecuada para el marco que esté usando:Set the WSGI_HANDLER entry in web.config as appropriate for the framework you're using:

    • Bottle: asegúrese de usar paréntesis después de app.wsgi_app como se muestra a continuación.Bottle: make sure that you have parentheses after app.wsgi_app as shown below. Esto resulta necesario porque ese objeto es una función (vea app.py) en lugar de una variable:This is necessary because that object is a function (see app.py) rather than a variable:

      <!-- 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.Flask: Change the WSGI_HANDLER value to <project_name>.app where <project_name> matches the name of your project. Puede encontrar el identificador exacto examinando la instrucción from <project_name> import app en runserver.py.You can find the exact identifier by looking at the from <project_name> import app statement in the runserver.py. Por ejemplo, si el proyecto se denominara "FlaskAzurePublishExample", la entrada aparecería así:For example, if the project is named "FlaskAzurePublishExample", the entry would appear as follows:

      <!-- Flask apps only: change the project name to match your app -->
      <add key="WSGI_HANDLER" value="flask_iis_example.app"/>
      
    • Django: se requieren dos cambios en web.config para los proyectos de Django.Django: Two changes are needed to web.config for Django projects. En primer lugar, cambie el valor WSGI_HANDLER a django.core.wsgi.get_wsgi_application() (el objeto está en el archivo wsgi.py):First, change the WSGI_HANDLER value to django.core.wsgi.get_wsgi_application() (the object is in the wsgi.py file):

      <!-- Django apps only -->
      <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()"/>
      

      En segundo lugar, agregue la siguiente entrada debajo de la de WSGI_HANDLER, reemplazando DjangoAzurePublishExample por el nombre del proyecto:Second, add the following entry below the one for WSGI_HANDLER, replacing DjangoAzurePublishExample with the name of your project:

      <add key="DJANGO_SETTINGS_MODULE" value="django_iis_example.settings" />
      
  4. Solo para las aplicaciones de Django: en el archivo settings.py del proyecto de Django, agregue el dominio de dirección URL del sitio o la dirección IP a ALLOWED_HOSTS, como se muestra más adelante, reemplazando, por supuesto, "1.2.3.4" con su dirección URL o su dirección IP:Django apps only: In the Django project's settings.py file, add your site URL domain or IP address to ALLOWED_HOSTS as shown below, replacing '1.2.3.4' with your URL or IP address, of course:

    # Change the URL or IP address to your specific site
    ALLOWED_HOSTS = ['1.2.3.4']
    

    Si no agrega la dirección URL a la matriz, se genera un error DisallowedHost at / Invalid HTTP_HOST header: "<site URL>". Es posible que tenga que agregar "<site URL>" a ALLOWED_HOSTS.Failure to add your URL to the array results in the error DisallowedHost at / Invalid HTTP_HOST header: '<site URL>'. You may need to add '<site URL>' to ALLOWED_HOSTS.

    Tenga en cuenta que, cuando la matriz está vacía, Django permite automáticamente "localhost" y "127.0.0.1", pero agregar la dirección URL de producción quita esas funcionalidades.Note that when the array is empty, Django automatically allows 'localhost' and '127.0.0.1', but adding your production URL removes those capabilities. Por este motivo, puede que desee mantener copias de desarrollo y producción independientes de settings.py, o bien usar variables de entorno para controlar los valores de tiempo de ejecución.For this reason you might want to maintain separate development and production copies of settings.py, or use environment variables to control the run time values.

Implementación en IIS o una máquina virtual WindowsDeploy to IIS or a Windows VM

Con el archivo web.config correcto en el proyecto, puede publicar en el equipo que ejecuta IIS si usa el comando Publish en el menú contextual del proyecto en el Explorador de soluciones y selecciona la opción IIS, FTP, etc. .With the correct web.config file in your project, you can publish to the computer running IIS by using the Publish command on the project's context menu in Solution Explorer, and selecting the option, IIS, FTP, etc.. En este caso, Visual Studio simplemente copia los archivos del proyecto en el servidor. Usted es responsable de toda la configuración del lado servidor.In this case, Visual Studio simply copies the project files to the server; you're responsible for all server-side configuration.