Administrar Python en Azure App ServiceManaging Python on Azure App Service

Azure App Service es una plataforma como servicio que se ofrece para las aplicaciones web, ya sean sitios a los que se acceda a través de un explorador, API de REST que usan sus propios clientes o procesamientos desencadenados por un evento.Azure App Service is a platform-as-a-service offering for web apps, whether they are sites accessed through a browser, REST APIs used by your own clients, or event-triggered processing. App Service admite completamente el uso de Python para implementar aplicaciones.App Service fully supports using Python to implement apps.

La compatibilidad de Python personalizable en Azure App Service se proporciona como un conjunto de extensiones de sitio de App Service en la que cada una contiene una versión específica del tiempo de ejecución de Python.Customizable Python support on Azure App Service is provided as a set of App Service site extensions that each contain a specific version of the Python runtime. Así, se pueden instalar los paquetes que se quiera directamente en ese entorno, como se describe en este tema.You can then install any desired packages directly into that environment, as described in this topic. Al personalizar el entorno en el propio App Service, no es necesario mantener los paquetes en los proyectos de aplicación web ni cargarlos con el código de la aplicación.By customizing the environment in the App Service itself, you don't need to maintain packages in your web app projects or upload them with the app code.

Sugerencia

Aunque App Service hace que Python 2.7 y Python 3.4 se instalen de forma predeterminada en las carpetas raíz del servidor, no se pueden personalizar ni instalar paquetes en esos entornos, ni tampoco conviene depender de su existencia o no.Although App Service by default has Python 2.7 and Python 3.4 installed in root folders on the server, you cannot customize or install packages in these environments, nor should you depend on their presence. En su lugar, es mejor basarse en una extensión de sitio que pueda controlar, como se describe en este tema.You should instead rely on a site extension that you control, as described in this topic.

Importante

Los procesos que se describen aquí están sujetos a cambios, y especialmente a mejoras.The processes described here are subject to change, and especially to improvement. Los cambios se anuncian en Ingeniería de Python en el blog de Microsoft.Changes are announced on the Python Engineering at Microsoft blog.

Elegir una versión de Python a través de Azure PortalChoosing a Python version through the Azure portal

  1. Cree un App Service de su aplicación web en Azure Portal.Create an App Service for your web app on the Azure portal.
  2. En la página de App Service, vaya a la sección Herramientas de desarrollo, seleccione Extensiones y, después, + Agregar.On the App Service's page, scroll to the Development Tools section, select Extensions, then select + Add.
  3. Desplácese por la lista hasta encontrar la extensión que contiene la versión de Python que busca:Scroll down in the list to the extension that contains the version of Python you want:

    Extensiones de Python en Azure Portal

    Sugerencia

    Si necesita una versión anterior de Python y no la ve en las extensiones de sitio, puede instalarla a través de Azure Resource Manager, tal y como se describe en la siguiente sección.If you need an older version of Python and don't see it listed in the site extensions, you can still install it through the Azure Resource Manager as described in the next section.

  4. Seleccione la extensión, acepte los términos legales y, después, seleccione Aceptar.Select the extension, accept the legal terms, then select OK.

  5. Cuando la instalación finalice, aparecerá una notificación en el portal.A notification appears in the portal when installation is complete.

Elegir una versión de Python a través de Azure Resource ManagerChoosing a Python version through the Azure Resource Manager

Si va a implementar App Service con una plantilla de Azure Resource Manager, agregue la extensión de sitio como un recurso.If you are deploying an App Service with an Azure Resource Manager template, add the site extension as a resource. La extensión aparece como un recurso anidado con el tipo siteextensions y el nombre de siteextensions.net.The extension appears as a nested resource with the type siteextensions and the name from siteextensions.net.

Por ejemplo, después de agregar una referencia a python361x64 (Python 3.6.1 x64), la plantilla puede tener el siguiente aspecto (algunas propiedades no se incluyen):For example, after adding a reference to python361x64 (Python 3.6.1 x64), your template may look like the following (some properties omitted):

"resources": [
  {
    "apiVersion": "2015-08-01",
    "name": "[parameters('siteName')]",
    "type": "Microsoft.Web/sites",

    // ...

    "resources": [
      {
        "apiVersion": "2015-08-01",
        "name": "python361x64",
        "type": "siteextensions",
        "properties": { },
        "dependsOn": [
          "[resourceId('Microsoft.Web/sites', parameters('siteName'))]"
        ]
      },
      // ...
    ]
  }

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

Después de instalar la extensión de sitio (a través del portal o de una plantilla de Azure Resource Manager), lo siguiente es hacer que el archivo web.config de la aplicación apunte al intérprete de Python.After installing the site extension (through either the portal or an Azure Resource Manager template), you next point your app's web.config file to the Python interpreter. El archivo web.config indica al servidor web de IIS (7+) que se ejecuta en App Service el modo en que debe administrar las solicitudes de Python a través de FastCGI o HttpPlatform.The web.config file instructs the IIS (7+) web server running on App Service about how it should handle Python requests through either FastCGI or HttpPlatform.

Empiece buscando la ruta de acceso completa a la extensión de sitio python.exe y, luego, cree y modifique el archivo web.config correspondiente.Begin by finding the full path to the site extension's python.exe, then create and modify the appropriate web.config file.

Buscar la ruta de acceso apython.exeFinding the path to python.exe

Hay una extensión de sitio de Python instalada en el servidor en d:\home, en una carpeta adecuada a la versión y arquitectura de Python (excepto en el caso de algunas versiones anteriores).A Python site extension is installed on the server under d:\home in a folder appropriate to the Python version and architecture (except in the case of a few older versions). Por ejemplo, Python 3.6.1 x64 se instala en d:\home\python361x64.For example, Python 3.6.1 x64 is installed in d:\home\python361x64. En este caso, la ruta al intérprete de Python sería d:\home\python361x64\python.exe.The full path to the Python interpreter is then d:\home\python361x64\python.exe.

Para ver la ruta de acceso específica en App Service, seleccione Extensiones en la página de App Service y seleccione la extensión en la lista.To see the specific path on your App Service, select Extensions on the App Service page, then select the extension in the list.

Lista de extensiones en Azure App Service

Con esta acción se abre la página de descripción de la extensión que contiene la ruta de acceso:This action opens the extension's description page containing the path:

Información de extensiones en Azure App Service

Si tiene problemas para ver la ruta de acceso de la extensión, la puede encontrar manualmente a través de la consola:If you have trouble seeing the path for the extension, you can find it manually using the console:

  1. En la página de App Service, seleccione Herramientas de desarrollo > Consola.On your App Service page, select the Development Tools > Console.
  2. Escriba el comando ls ../home o dir ..\home para ver las carpetas de extensión de nivel superior, como Python361x64.Enter the command ls ../home or dir ..\home to see the top-level extensions folders, such as Python361x64.
  3. Escriba un comando como ls ../home/python361x64 o dir ..\home\python361x64 para confirmar que esa carpeta contiene python.exe y otros archivos de intérprete.Enter a command like ls ../home/python361x64 or dir ..\home\python361x64 to verify that it contains python.exe and other interpreter files.

Configurar el controlador FastCGIConfiguring 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. El paquete wfastcgi está preinstalado y configurado con cada extensión de sitio de Python, por lo que puede habilitarlo fácilmente incluyendo el código siguiente en web.config, como lo que se muestra aquí, perteneciente a una aplicación web basada en el marco Bottle.The wfastcgi package is pre-installed and configured with each Python site extension, so you can easily enable it by including the code in web.config like what's shown below for a web app based on the Bottle framework. Observe que las rutas de acceso completas a python.exe y a wfastcgi.py se colocan en la clave PythonHandler:Note that the full paths to python.exe and wfastcgi.py are placed in the PythonHandler key:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="PYTHONPATH" value="D:\home\site\wwwroot"/>
    <!-- The handler here is specific to Bottle; other frameworks vary. -->
    <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
    <add key="WSGI_LOG" value="D:\home\LogFiles\wfastcgi.log"/>
  </appSettings>
  <system.webServer>
    <handlers>
      <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule"
           scriptProcessor="D:\home\Python361x64\python.exe|D:\home\Python361x64\wfastcgi.py"
           resourceType="Unspecified" requireAccess="Script"/>
    </handlers>
  </system.webServer>
</configuration>

Los valores de <appSettings> aquí definidos están disponibles para la aplicación como variables de entorno:The <appSettings> defined here 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.

Vea Publicación en Azure App Service para obtener más detalles sobre el contenido de web.config para las aplicaciones web de Bottle, Flask y Django.See Publishing to Azure for additional details on web.config contents for Bottle, Flask, and Django web apps.

Configurar el controlador de HttpPlatformConfiguring 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="D:\home\Python361x64\python.exe"
                  arguments="D:\home\site\wwwroot\runserver.py --port %HTTP_PLATFORM_PORT%"
                  stdoutLogEnabled="true"
                  stdoutLogFile="D:\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.

Instalación de paquetesInstalling packages

El intérprete de Python instalado a través de una extensión de sitio es solo una parte del entorno de Python.The Python interpreter installed through a site extension is only one piece of your Python environment. Probablemente necesite instalar varios paquetes en ese entorno también.You likely need to install different packages in that environment as well.

Para instalar paquetes directamente en el entorno del servidor, emplee uno de los siguientes métodos:To install packages directly in the server environment, use one of the following methods:

MétodosMethods UsoUsage
Consola de Kudu para Azure App ServiceAzure App Service Kudu console Instala los paquetes de forma interactiva.Installs packages interactively. Los paquetes deben ser Python puro o deben publicar paquetes wheel.Packages must be pure Python or must publish wheels.
API de REST de KuduKudu REST API Se puede usar para automatizar la instalación de paquetes.Can be used to automate package installation. Los paquetes deben ser Python puro o deben publicar paquetes wheel.Packages must be pure Python or must publish wheels.
Incluir con la aplicaciónBundle with app Instale paquetes directamente en el proyecto y, después, impleméntelos en App Service como si formasen parte de la aplicación.Install packages directly into your project and then deploy them to App Service as if they were part of your app. Dependiendo del número de dependencias que tenga y la frecuencia con la que las actualice, este método puede ser la manera más sencilla de obtener una implementación funcional.Depending on how many dependencies you have and how frequently you update them, this method may be the easiest way to get a working deployment going. Conviene saber que estas bibliotecas deben coincidir con la versión de Python del servidor o, de lo contrario, verá errores poco conocidos tras la implementación.Be advised that libraries must match the version of Python on the server, otherwise you see obscure errors after deployment. Dicho esto, como las versiones de Python en las extensiones de sitio de App Service son exactamente las mismas que las que se han presentado en python.org, puede obtener fácilmente una versión compatible para la implementación local.That said, because the versions of Python in the App Service site extensions are exactly the same as those versions released on python.org, you can easily obtain a compatible version for local development.
Entornos virtualesVirtual environments No se admite.Not supported. En su lugar, use el método de inclusión y establezca la variable de entorno PYTHONPATH de forma que apunte a la ubicación de los paquetes.Instead, use bundling and set the PYTHONPATH environment variable to point to the location of the packages.

Consola de Kudu para Azure App ServiceAzure App Service Kudu console

La consola de Kudu le proporciona acceso de línea de comandos directo y con privilegios elevados al servidor de App Service y a su sistema de archivos.The Kudu console gives you direct, elevated command-line access to the App Service server and its file system. Aparte de ser una valiosa herramienta de depuración, también permite operaciones de CLI como la instalación de paquetes.This is both a valuable debugging tool and allows for CLI operations such as installing packages.

  1. Abra Kudu desde la página de App Service en Azure Portal; para ello, seleccione Herramientas de desarrollo > Herramientas avanzadas y seleccione Ir.Open Kudu from your App Service page on the Azure portal by selecting Development Tools > Advanced Tools, then selecting Go. Con esta acción, se le llevará a una dirección URL similar a la dirección URL base de App Service, salvo que tiene insertado .scm.This action navigates to a URL that's the same as your base App Service URL except with .scm inserted. Por ejemplo, si la dirección URL base es https://vspython-test.azurewebsites.net/, Kudu está en https://vspython-test.scm.azurewebsites.net/ (puede guardarla como marcador):For example, if your base URL is https://vspython-test.azurewebsites.net/ then Kudu is on https://vspython-test.scm.azurewebsites.net/ (which you can bookmark):

    La consola de Kudu para Azure App Service

  2. Seleccione Consola de depuración > CMD para abrir la consola, en la que puede navegar en su instalación de Python y ver qué bibliotecas ya están ahí.Select Debug console > CMD to open the console, in which you can navigate into your Python installation and see what libraries are already there.

  3. Para instalar un único paquete:To install a single package:

    a.a. Vaya a la carpeta de la instalación de Python donde quiera instalar el paquete, como d:\home\python361x64.Navigate to the folder of the Python installation where you want to install the package, such as d:\home\python361x64.

    b.b. Use python.exe -m pip install <package_name> para instalar un paquete.Use python.exe -m pip install <package_name> to install a package.

    Ejemplo de instalación de Bottle a través de la consola de Kudu para Azure App Service

  4. Si ya ha implementado un archivo requirements.txt para la aplicación en el servidor, instale todos esos requisitos del siguiente modo:If you've deployed a requirements.txt for your app to the server already, install all those requirements as follows:

    a.a. Vaya a la carpeta de la instalación de Python donde quiera instalar el paquete, como d:\home\python361x64.Navigate to the folder of the Python installation where you want to install the package, such as d:\home\python361x64.

    b.b. Ejecute el comando python.exe -m pip install --upgrade -r d:\home\site\wwwroot\requirements.txt.Run the command python.exe -m pip install --upgrade -r d:\home\site\wwwroot\requirements.txt.

    Se recomienda usar requirements.txt, porque es sencillo reproducir el paquete exacto que se ha establecido tanto localmente como en el servidor.Using requirements.txt is recommended because it's easy to reproduce your exact package set both locally and on the server. Recuerde simplemente ir a la consola después de implementar los cambios realizados en requirements.txt y volver a ejecutar el comando.Just remember to visit the console after deploying any changes to requirements.txt and run the command again.

Nota

En App Service no existe ningún compilador de C, por lo que necesita instalar el paquete wheel para cualquier paquete con módulos de extensión nativos.There's no C compiler on App Service, so you need to install the wheel for any packages with native extension modules. Muchos paquetes conocidos proporcionan sus propias ruedas.Many popular packages provide their own wheels. Para los paquetes que no lo hacen, use pip wheel <package_name> en su equipo de desarrollo local y, después, cargue la rueda en su sitio.For packages that don't, use pip wheel <package_name> on your local development computer and then upload the wheel to your site. Para obtener un ejemplo, vea Administración de paquetes necesarios.For an example, see Managing required packages.

API de REST de KuduKudu REST API

En lugar de usar la consola de Kudu mediante Azure Portal, puede ejecutar comandos de manera remota mediante la API de REST de Kudu publicando el comando en https://yoursite.scm.azurewebsites.net/api/command.Instead of using the Kudu console through the Azure portal, you can run commands remotely through the Kudu REST API by posting the command to https://yoursite.scm.azurewebsites.net/api/command. Por ejemplo, para instalar el paquete bottle, publique el siguiente JSON en /api/command:For example, to install the bottle package, post the following JSON to /api/command:

{
    "command": 'python.exe -m pip install bottle',
    "dir": '\home\python361x64'
}

Para obtener información sobre los comandos y la autenticación, vea la documentación de Kudu.For information about commands and authentication, see the Kudu documentation.

También puede ver las credenciales usando el comando az webapp deployment list-publishing-profiles por medio de la CLI de Azure. Vea az webapp deployment.You can also see credentials using the az webapp deployment list-publishing-profiles command through the Azure CLI (see az webapp deployment). En GitHub hay disponible una biblioteca auxiliar para registrar comandos de Kudu.A helper library for posting Kudu commands is available on GitHub.