Gestion de Python sur Azure App ServiceManaging Python on Azure App Service

Azure App Service est une offre PaaS (Platform-as-a-Service) pour les applications web, qu’il s’agisse de sites accessibles via un navigateur, d’API REST utilisées par vos propres clients ou de traitement déclenché par un événement.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 prend entièrement en charge l’utilisation de Python pour implémenter des applications.App Service fully supports using Python to implement apps.

Une prise en charge personnalisable de Python sur Azure App Service est fournie sous la forme d’un ensemble d’extensions de site App Service qui contiennent chacune une version spécifique du runtime 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. Vous pouvez alors installer les packages souhaités directement dans cet environnement, comme décrit dans cet article.You can then install any desired packages directly into that environment, as described in this article. En personnalisant l’environnement dans le service App Service lui-même, vous n’avez pas besoin gérer les packages dans vos projets d’application web ou de les charger avec le code de l’application.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.

Conseil

Bien que Python 2.7 et 3.4 soient installés par défaut sur App Service dans les dossiers racine du serveur, vous ne pouvez pas personnaliser ni installer des packages dans ces environnements, et vous ne devez pas dépendre de leur présence.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. Vous devez à la place vous appuyer sur une extension de site que vous contrôlez, comme décrit dans cet article.You should instead rely on a site extension that you control, as described in this article.

Important

Les processus décrits ici sont susceptibles de changer, notamment à des fins d’amélioration.The processes described here are subject to change, and especially to improvement. Les modifications sont annoncées sur le blog Python Engineering at Microsoft.Changes are announced on the Python Engineering at Microsoft blog.

Choix d’une version de Python via le portail AzureChoosing a Python version through the Azure portal

  1. Créez un service App Service pour votre application web sur le portail Azure.Create an App Service for your web app on the Azure portal.
  2. Sur la page du service App Service, accédez à la section Outils de développement, sélectionnez Extensions, puis sélectionnez + Ajouter.On the App Service's page, scroll to the Development Tools section, select Extensions, then select + Add.
  3. Faites défiler la liste vers le bas jusqu’à l’extension qui contient la version de Python souhaitée :Scroll down in the list to the extension that contains the version of Python you want:

    Portail Azure montrant les extensions Python

    Conseil

    Si vous avez besoin d’une version plus ancienne de Python et qu’elle ne figure pas dans les extensions de site, vous pouvez l’installer via Azure Resource Manager, comme décrit dans la section suivante.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. Sélectionnez l’extension, acceptez les conditions juridiques, puis sélectionnez OK.Select the extension, accept the legal terms, then select OK.

  5. Une notification apparaît dans le portail quand l’installation est terminée.A notification appears in the portal when installation is complete.

Choix d’une version de Python via Azure Resource ManagerChoosing a Python version through the Azure Resource Manager

Si vous déployez un service App Service avec un modèle Azure Resource Manager, ajoutez l’extension de site en tant que ressource.If you are deploying an App Service with an Azure Resource Manager template, add the site extension as a resource. L’extension apparaît sous forme de ressource imbriquée avec le type siteextensions et le nom issu de siteextensions.net.The extension appears as a nested resource with the type siteextensions and the name from siteextensions.net.

Par exemple, après l’ajout d’une référence à python361x64 (Python 3.6.1 x64), votre modèle peut ressembler à ceci (certaines propriétés étant omises) :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'))]"
        ]
      },
      // ...
    ]
  }

Définition de web.config pour le faire pointer vers l’interpréteur PythonSetting web.config to point to the Python interpreter

Après avoir installé l’extension de site (via le portail ou un modèle Azure Resource Manager), vous faites ensuite pointer le fichier web.config de votre application vers l’interpréteur 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. Le fichier web.config indique au serveur web IIS (7+) qui s’exécute sur App Service comment il doit gérer les demandes Python via FastCGI ou 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.

Commencez par rechercher le chemin complet du fichier python.exe de l’extension de site, puis créez et modifiez le fichier web.config approprié.Begin by finding the full path to the site extension's python.exe, then create and modify the appropriate web.config file.

Recherche du chemin de python.exeFinding the path to python.exe

Une extension de site Python est installée sur le serveur, sous d:\home dans un dossier approprié pour la version de Python et pour l’architecture (sauf dans le cas de quelques versions plus anciennes).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). Par exemple, Python 3.6.1 x64 est installé dans d:\home\python361x64.For example, Python 3.6.1 x64 is installed in d:\home\python361x64. Le chemin complet de l’interpréteur Python est alors d:\home\python361x64\python.exe.The full path to the Python interpreter is then d:\home\python361x64\python.exe.

Pour voir le chemin d’accès spécifique de votre service App Service, sélectionnez Extensions dans la page App Service, puis sélectionnez l’extension dans la liste.To see the specific path on your App Service, select Extensions on the App Service page, then select the extension in the list.

Liste des extensions sur Azure App Service

Cette action ouvre la page de description de l’extension, qui contient le chemin :This action opens the extension's description page containing the path:

Détails des extensions sur Azure App Service

Si vous avez des difficultés à voir le chemin pour l’extension, vous pouvez le trouver manuellement en utilisant la console :If you have trouble seeing the path for the extension, you can find it manually using the console:

  1. Sur la page de votre service App Service, sélectionnez Outils de développement > Console.On your App Service page, select the Development Tools > Console.
  2. Entrez la commande ls ../home ou dir ..\home pour afficher les dossiers d’extensions du plus haut niveau, comme Python361x64.Enter the command ls ../home or dir ..\home to see the top-level extensions folders, such as Python361x64.
  3. Entrez une commande comme ls ../home/python361x64 ou dir ..\home\python361x64 pour vérifier qu’il contient python.exe et les autres fichiers de l’interpréteur.Enter a command like ls ../home/python361x64 or dir ..\home\python361x64 to verify that it contains python.exe and other interpreter files.

Configuration du gestionnaire FastCGIConfiguring the FastCGI handler

FastCGI est une interface qui fonctionne au niveau de la demande.FastCGI is an interface that works at the request level. IIS reçoit les connexions entrantes et transmet chaque demande à une application WSGI exécutée dans un ou plusieurs processus Python persistants.IIS receives incoming connections and forwards each request to a WSGI app running in one or more persistent Python processes. Comme le package wfastcgi est préinstallé et configuré avec chaque extension de site Python, vous pouvez facilement l’activer en incluant le code dans web.config, comme ce qui est montré ci-dessous pour une application web basée sur le framework 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. Notez que les chemins complets de python.exe et de wfastcgi.py sont placés dans la clé 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>

Les <appSettings> définis ici sont disponibles pour votre application en tant que variables d’environnement :The <appSettings> defined here are available to your app as environment variables:

  • La valeur de PYTHONPATH peut être librement étendue, mais elle doit inclure la racine de votre application.The value for PYTHONPATH may be freely extended but must include the root of your app.
  • WSGI_HANDLER doit pointer vers une application WSGI importable à partir de votre application.WSGI_HANDLER must point to a WSGI app importable from your app.
  • WSGI_LOG est facultatif mais recommandé pour le débogage de votre application.WSGI_LOG is optional but recommended for debugging your app.

Consultez Publication sur Azure pour plus d’informations sur le contenu de web.config pour les applications Bottle, Flask et Django.See Publishing to Azure for additional details on web.config contents for Bottle, Flask, and Django web apps.

Configuration du gestionnaire HttpPlatformConfiguring the HttpPlatform handler

Le module HttpPlatform passe les connexions de socket directement à un processus Python autonome.The HttpPlatform module passes socket connections directly to a standalone Python process. Cette transmission vous permet d’exécuter n’importe quel serveur web de votre choix, mais nécessite un script de démarrage qui exécute un serveur 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. Vous spécifiez le script dans l’élément <httpPlatform> de web.config, où l’attribut processPath pointe vers l’interpréteur Python de l’extension de site et l’attribut arguments pointe vers votre script et les arguments que vous voulez fournir :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 d’environnement HTTP_PLATFORM_PORT montrée ici contient le port sur lequel votre serveur local doit écouter les connexions à partir de localhost.The HTTP_PLATFORM_PORT environment variable shown here contains the port that your local server should listen on for connections from localhost. Cet exemple montre également comment créer une autre variable d’environnement si vous le souhaitez, dans ce cas SERVER_PORT.This example also shows how to create another environment variable, if desired, in this case SERVER_PORT.

Installation de packagesInstalling packages

L’interpréteur Python installé via une extension de site n’est qu’une partie de votre environnement Python.The Python interpreter installed through a site extension is only one piece of your Python environment. Cela signifie que devez probablement installer aussi différents packages dans cet environnement.You likely need to install different packages in that environment as well.

Pour installer des packages directement dans l’environnement du serveur, utilisez une des méthodes suivantes :To install packages directly in the server environment, use one of the following methods:

MéthodesMethods UtilisationUsage
Console Kudu d’Azure App ServiceAzure App Service Kudu console Installe des packages de façon interactive.Installs packages interactively. Les packages doivent être du Python pur ou doivent publier des wheels.Packages must be pure Python or must publish wheels.
API REST KuduKudu REST API Peut être utilisée pour automatiser l’installation de packages.Can be used to automate package installation. Les packages doivent être du Python pur ou doivent publier des wheels.Packages must be pure Python or must publish wheels.
Regrouper avec une applicationBundle with app Installez des packages directement dans votre projet, puis déployez-les sur App Service comme s’ils faisaient partie de votre application.Install packages directly into your project and then deploy them to App Service as if they were part of your app. Selon le nombre de dépendances et la fréquence de leur mise à jour, cette méthode peut représenter le moyen le plus simple de lancer un déploiement de travail.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. Notez que les bibliothèques doivent correspondre exactement à la version de Python sur le serveur. Dans le cas contraire, des erreurs incompréhensibles se produisent après le déploiement.Be advised that libraries must match the version of Python on the server, otherwise you see obscure errors after deployment. Cela dit, comme les versions de Python dans les extensions de site App Service sont exactement les mêmes que celles publiées sur python.org, vous pouvez facilement obtenir une version compatible pour un développement 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.
Environnements virtuelsVirtual environments Non pris en charge.Not supported. Au lieu de cela, utilisez le regroupement et définissez la variable d’environnement PYTHONPATH pour qu’elle pointe vers l’emplacement des packages.Instead, use bundling and set the PYTHONPATH environment variable to point to the location of the packages.

Console Kudu d’Azure App ServiceAzure App Service Kudu console

La console Kudu vous donne un accès direct à partir d’une ligne de commande avec des privilèges élevés au serveur App Service et à son système de fichiers.The Kudu console gives you direct, elevated command-line access to the App Service server and its file system. Il s’agit d’un outil précieux pour le débogage, qui autorise en outre les opérations CLI, comme l’installation de packages.This is both a valuable debugging tool and allows for CLI operations such as installing packages.

  1. Ouvrez Kudu depuis votre page App Service sur le portail Azure en sélectionnant Outils de développement > Outils avancés, puis en sélectionnant OK.Open Kudu from your App Service page on the Azure portal by selecting Development Tools > Advanced Tools, then selecting Go. Cette action accède à une URL qui est la même que l’URL de base de votre service App Service, excepté que .scm y est inséré.This action navigates to a URL that's the same as your base App Service URL except with .scm inserted. Par exemple, si votre URL de base est https://vspython-test.azurewebsites.net/, Kudu se trouve sur https://vspython-test.scm.azurewebsites.net/ (que vous pouvez mettre en signet) :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):

    Console Kudu pour Azure App Service

  2. Sélectionnez Console de débogage > CMD pour ouvrir la console, dans laquelle vous pouvez naviguer dans votre installation de Python et voir les bibliothèques qui y figurent déjà.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. Pour installer un package unique :To install a single package:

    a.a. Accédez au dossier de l’installation de Python où vous souhaitez installer le package, par exemple 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. Utilisez python.exe -m pip install <package_name> pour installer un package.Use python.exe -m pip install <package_name> to install a package.

    Exemple d’installation de Bottle via la console Kudu pour Azure App Service

  4. Si vous avez déjà déployé un fichier requirements.txt pour votre application sur le serveur, installez tous ces exigences comme suit :If you've deployed a requirements.txt for your app to the server already, install all those requirements as follows:

    a.a. Accédez au dossier de l’installation de Python où vous souhaitez installer le package, par exemple 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. Exécutez la commande 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.

    L’utilisation de requirements.txt est recommandée, car il est facile de reproduire exactement votre ensemble de packages à la fois localement et sur le serveur.Using requirements.txt is recommended because it's easy to reproduce your exact package set both locally and on the server. N’oubliez pas de revenir à la console après avoir déployé des modifications apportées à requirements.txt et de réexécuter la commande.Just remember to visit the console after deploying any changes to requirements.txt and run the command again.

Note

Comme il n’y a pas de compilateur C sur App Service, vous devez installer le format wheel pour les packages avec des modules d’extension natifs.There's no C compiler on App Service, so you need to install the wheel for any packages with native extension modules. De nombreux packages populaires fournissent leur propre format wheel.Many popular packages provide their own wheels. Pour les packages qui ne le font pas, utilisez pip wheel <package_name> sur votre ordinateur de développement local, puis chargez le format wheel sur votre site.For packages that don't, use pip wheel <package_name> on your local development computer and then upload the wheel to your site. Vous trouverez un exemple sur la page Gérer les packages requis avec requirements.txt.For an example, see Managing required packages with requirements.txt.

API REST KuduKudu REST API

Au lieu d’utiliser la console Kudu via le portail Azure, vous pouvez exécuter des commandes à distance via l’API REST Kudu en publiant la commande sur 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. Par exemple, pour installer le package bottle, publiez le texte JSON suivant sur /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'
}

Pour plus d’informations sur les commandes et l’authentification, consultez la documentation Kudu.For information about commands and authentication, see the Kudu documentation.

Vous pouvez également voir des informations d’identification avec la commande az webapp deployment list-publishing-profiles via l’interface CLI Azure (consultez 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). Une bibliothèque helper pour la publication de commandes Kudu est disponible sur GitHub.A helper library for posting Kudu commands is available on GitHub.