Publicar aplicaciones web de Python en Azure App Service en Linux

Visual Studio ofrece la posibilidad de publicar una aplicación web de Python directamente en Azure App Service en Linux. Publicar en Azure App Service en Linux implica copiar los archivos necesarios en el servidor y configurar un archivo web.config apropiado que indique al servidor web cómo lanzar la aplicación.

Nota:

Linux es la única opción de sistema operativo para ejecutar aplicaciones de Python en App Service. Python en Windows ya no es compatible, como se describe en Soporte técnico de Linux para App - Compatibilidad con Python. Para Windows, puede crear su propia imagen personalizada de contenedor de Windows y ejecutar la imagen en App Service. Para obtener más información, consulte Usar una imagen de Docker personalizada.

Requisitos previos

Versiones de Visual Studio

El proceso de publicación difiere entre Visual Studio 2017 y Visual Studio 2015. Ambos métodos se describen en este artículo.

  • Visual Studio 2015 automatiza algunos de los pasos de instalación, incluida la creación del archivo web.config, pero esta automatización limita la flexibilidad y el control a largo plazo.

  • Visual Studio 2017 y versiones posteriores requieren más pasos manuales de instalación, pero ofrece un control más exacto sobre el entorno de Python.

Para obtener más información sobre los cambios entre Visual Studio 2015 y Visual Studio 2017 y versiones posteriores, consulte la entrada de blog Publish to Azure in Visual Studio 2017 (Publicar en Azure en Visual Studio 2017).

Crear un proyecto de prueba

Si no tiene un proyecto existente para publicar, puede crear un proyecto de prueba para probar el proceso.

  1. En Visual Studio, seleccione Archivo > Nuevo > Proyecto en el menú de la barra de herramientas para abrir el cuadro de diálogo Crear un nuevo proyecto.

  2. En el cuadro de diálogo, escriba bottle en el cuadro Buscar, seleccione la plantilla Proyecto web de Bottle y, a continuación, seleccione Siguiente.

    El proyecto web de Bottle se incluye con la carga de trabajo de desarrollo de Python. Para obtener más información, consulte Plantillas de proyecto de aplicación web de Python.

  3. Escriba un nombre y una ubicación de ruta para el proyecto y, a continuación, seleccione Crear.

  4. Siga las indicaciones para instalar los paquetes externos, seleccione Instalar en un entorno virtual y elija el intérprete base que prefiera para el entorno virtual.

    El entorno virtual suele coincidir con la versión de Python instalada en App Service.

Cuando esté listo, puede probar el proyecto localmente. Para ello, seleccione Depurar > Iniciar depuración o utilice el método abreviado de teclado F5.

Creación de Azure App Service de destino

La publicación en Azure requiere un Azure App Service de destino para una suscripción de Azure.

Puede crear un App Service con una aplicación web vacía de la siguiente manera:

  1. Inicie sesión en el Portal de Azure.

  2. Vaya a la página App Services.

  3. Seleccione Crear y elija Aplicación web desde el menú desplegable. Se abre la página Crear aplicación web.

  4. En la pestaña Información básica, configure los siguientes valores:

    Configuración Descripción
    Grupo de recursos Omita este campo. El sistema actualiza este valor después de elegir la configuración en tiempo de ejecución.
    Nombre Escriba un nombre para la aplicación web.
    Publicar Seleccione Código.
    Pila del entorno en tiempo de ejecución Elija el entorno de ejecución de Python adecuado en el menú desplegable. Después de elegir un elemento, el sistema actualiza el campo Grupo de recursos.
    Región Seleccione cualquier región de Azure cercana.
    Plan de precios Seleccione el plan F1 gratis.

    Para ver los ejemplos de este artículo, puede omitir la configuración en las otras pestañas.

  5. Seleccione Revisar + crear. Revise las opciones seleccionadas y elija Crear.

  6. (Opcional) Una vez que la instancia de App Service esté lista, puede ir al recurso, seleccionar Descargar perfil de publicación y guardar el archivo localmente.

Configurar Python en Azure App Service

Cuando tenga una instancia de App Service con una aplicación web vacía que se ejecuta en la suscripción, instale la versión que desee de Python. Para publicar desde Visual Studio 2017 y versiones posteriores, registre la ruta exacta en el intérprete de Python instalado con la extensión. Para obtener más información, consulte Instalación de intérpretes de Python.

Si lo desea, también puede instalar el paquete bottle. Sin embargo, este paquete se instala en un paso posterior de este tutorial.

Publicación en App Service: Visual Studio 2017 y versiones posteriores

Al publicar en Azure App Service desde Visual Studio 2017, solo se copian los archivos de su proyecto en el servidor. Debe crear los archivos necesarios para configurar el entorno del servidor.

  1. En el Explorador de soluciones de Visual Studio, haga clic con el botón derecho en el proyecto y seleccione Agregar > Nuevo elemento. En el cuadro de diálogo, seleccione la plantilla Azure web.config (Fast CGI) y, a continuación, seleccione Agregar. Este paso crea un archivo web.config en la raíz del proyecto.

  2. Modifica la entrada PythonHandler en el archivo web.config para que la ruta de acceso coincida con la instalación de Python en el servidor, tal como se describe en la Referencia sobre la configuración de IIS (iis.net). Por ejemplo, para Python 3.6.1 x64, la entrada debería aparecer de esta forma:

    <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>
    
  3. Establece la entrada WSGI_HANDLER en el archivo web.config de forma adecuada para el marco que estés 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 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, examina la instrucción from <project_name> import app en el archivo runserver.py. Por ejemplo, si el proyecto se denominara "FlaskAzurePublishExample", la entrada aparecerí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, agrega el dominio de la dirección URL o la dirección IP del sitio a la entrada ALLOWED_HOSTS. Reemplace 'vspython-test-02.azurewebsites.net' por la dirección URL:

    # Change the URL to your specific site
    ALLOWED_HOSTS = ['vspython-test-02.azurewebsites.net']
    

    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' como host. Si agrega la dirección URL de producción, 'localhost' no se permite automáticamente como host. Por este motivo, puede que desees 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.

  5. Seleccione la plantilla.

    1. En Explorador de soluciones, expanda la carpeta del proyecto.
    2. Haga clic con el botón derecho en la carpeta static y seleccione Agregar > Nuevo elemento.
    3. Seleccione la plantilla web.config de archivos estáticos de Azure y seleccione Agregar.

    Esta acción crea otro archivo web.config en la carpeta static que deshabilita el procesamiento de Python para esa carpeta. Esta configuración envía solicitudes de archivos estáticos al servidor web predeterminado en lugar de usar la aplicación de Python.

  6. En el Explorador de soluciones guarde el proyecto y haga clic con el botón derecho en el proyecto y seleccione Publicar.

    Captura de pantalla donde se ve cómo acceder al comando Publicar de un proyecto en Visual Studio.

  7. En la ventana Publicar, especifique el destino de publicación:

    1. En Destino, seleccione Azure y, a continuación, seleccione Siguiente.

    2. En Destino específico, seleccione Azure App Service (Windows) y seleccione Siguiente.

      • Si el cuadro de diálogo indica que se necesitan otros Componentes necesarios para completar la instalación, seleccione Finalizar. Se abre el Instalador de Visual Studio. Confirme las opciones y seleccione Instalar.
    3. En App Service, seleccione la instancia de App Service adecuada para la suscripción y seleccione Finalizar.

      Captura de pantalla donde aparece cómo preparar el proceso de publicación en Azure en Visual Studio 2017 y versiones posteriores mediante una suscripción existente.

      Una vez completado el proceso de creación de la publicación, seleccione Cerrar.

  8. Visual Studio muestra el estado en una ventana "Actividad de publicación web" y también en la ventana Progreso de creación del perfil de publicación. Cuando vea el mensaje "Listo para publicar" para la aplicación web, seleccione Publicar.

    Captura de pantalla que muestra cómo publicar la aplicación web desde Visual Studio.

  9. Cuando la publicación se realiza correctamente, se abre el navegador predeterminado en la dirección URL del sitio. La dirección URL del sitio también se muestra en la ventana Publicar.

    Captura de pantalla que muestra el explorador abierto con la dirección URL del sitio de la aplicación web publicada.

    Si la dirección URL del sitio no se abre automáticamente, seleccione Abrir sitio para ver la aplicación web en el explorador:

    Captura de pantalla donde se ve cómo abrir la dirección URL del sitio para la aplicación web publicada en el explorador.

  10. Cuando se abre el explorador, es posible que vea el mensaje "The page cannot be displayed because an internal server error has occurred (No se puede mostrar la página porque se ha producido un error interno del servidor)". Este mensaje indica que el entorno de Python en el servidor no está totalmente configurado, en cuyo caso realice los pasos siguientes:

    1. Asegúrese de tener instalada una extensión de sitio de Python adecuada. Para obtener más información, consulte Inicio rápido: implementación de una aplicación web de Python (Django o Flask) en Azure App Service.

    2. Compruebe la ruta al intérprete de Python en el archivo web.config. La ruta debe coincidir exactamente con la ubicación de instalación de la extensión de sitio elegida.

    3. Utiliza la consola de Kudu para actualizar los paquetes enumerados en el archivo requirements.txt de la aplicación. Ve a la misma carpeta de Python que se usa en el archivo web.config, como /home/python361x64. Ejecute el siguiente comando tal y como se describe en la sección Consola de Kudu:

      python -m pip install --upgrade -r /home/site/wwwroot/requirements.txt
      

      Si ve errores de permiso al ejecutar este comando, confirme que está ejecutando el comando en la carpeta de extensión del sitio. No ejecute el comando en una carpeta que tenga una de las instalaciones predeterminadas de Python de App Service. Dado que no se pueden modificar esos entornos predeterminados, se producirá un error al intentar instalar paquetes.

    4. Para obtener una salida de error detallada, agrega la siguiente línea al archivo web.config dentro del nodo <system.webServer>, que proporciona una salida de error más detallada:

      <httpErrors errorMode="Detailed"></httpErrors>
      
    5. Pruebe a reiniciar el App Service después de instalar nuevos paquetes. No es necesario reiniciar al cambiar el archivo web.config, ya que la instancia de App Service realiza un reinicio automático cada vez que se cambia el archivo web.config.

      Sugerencia

      Si realiza algún cambio en el archivo requirements.txt de la aplicación, asegúrese de usar de nuevo la consola de Kudu para instalar cualquier paquete que esté ahora incluido en ese archivo.

  11. Después de configurar completamente el entorno del servidor, actualice la página en el explorador para ver la aplicación web:

    Captura de pantalla que muestra los resultados de la publicación de aplicaciones Bottle, Flask y Django en Azure App Service en Visual Studio.

Publicar en App Service: Visual Studio 2015

Siga estos pasos para publicar la aplicación web de Python en Azure App Service en Visual Studio 2015.

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Publicar.

  2. En el cuadro de diálogo Publicar, seleccione Microsoft Azure App Service:

    Captura de pantalla donde se indica cómo publicar en Azure en Visual Studio y seleccionar un Azure App Service.

  3. Seleccione Microsoft Azure App Service como destino de publicación. En el cuadro de diálogo siguiente, seleccione una instancia de App Service existente o seleccione Nuevo para crear una instancia nueva.

  4. Los detalles de App Service aparecen en la pestaña Conexión del cuadro de diálogo Publicar:

    Captura de pantalla donde se ve cómo publicar en Azure en Visual Studio y ver la conexión de App Service.

  5. Según sea necesario, seleccione Siguiente para revisar otras opciones de configuración.

  6. Seleccione Publicar. Después de que la aplicación se implemente en Azure, el explorador predeterminado se abre en la dirección URL del sitio.

Como parte de este proceso, Visual Studio también completa los siguientes pasos:

  • Crea un archivo web.config en el servidor que contiene punteros adecuados a la función wsgi_app de la aplicación y al intérprete predeterminado Python 3.4 de App Service.
  • Desactiva el procesamiento de archivos en la carpeta static del proyecto. (Las reglas de esta acción se encuentran en el archivo web.config).
  • Publica el entorno virtual en el servidor.
  • Agrega un archivo web.debug.config y las herramientas de depuración para permitir la depuración remota. En Visual Studio 2019, versión 16.4 y anterior, la herramienta de depuración es ptvsd. En Visual Studio 2019, versión 16.5 y posteriores, la herramienta de depuración es debugpy.

Tal y como se mencionó antes, estos pasos automáticos simplifican el proceso de publicación, pero pueden dificultar el control del entorno de Python. Por ejemplo, el archivo web.config se crea solo en el servidor, pero no se agrega al proyecto. El proceso de publicación también tarda más, ya que copia todo el entorno virtual desde el equipo de desarrollo en lugar de confiar en la configuración del servidor.

Finalmente, es posible que desees mantener tu propio archivo web.config y usar el archivo requirements.txt para mantener los paquetes en el servidor directamente. Al usar el archivo requirements.txt, en particular, puedes ayudar a garantizar que los entornos de desarrollo y servidor coincidan siempre.