Publication sur Azure App ServicePublishing to Azure App Service

Visual Studio offre la possibilité de publier directement une application web Python sur Azure App Service.Visual Studio provides the capability to publish a Python web app directly to Azure App Service. La publication sur Azure App Service signifie copier les fichiers nécessaires sur le serveur et configurer un fichier web.config approprié qui indique au serveur web comment lancer votre application.Publishing to Azure App Service means copying the necessary files to the server and setting up an appropriate web.config file that instructs the web server how to launch your app.

Le processus de publication diffère entre Visual Studio 2017 et Visual Studio 2015.The publishing process differs between Visual Studio 2017 and Visual Studio 2015. En particulier, Visual Studio 2015 automatise certaines des étapes, notamment la création de web.config, mais cette automatisation limite la flexibilité et le contrôle sur le long terme.Specifically, Visual Studio 2015 automates some of the steps, including the creation of web.config, but this automation limits long-term flexibility and control. Visual Studio 2017 nécessite plus d’étapes manuelles, mais offre un contrôle plus précis sur votre environnement Python.Visual Studio 2017 requires more manual steps but provides more exact control over your Python environment. Les deux options sont décrites ici.Both options are described here.

Note

Pour plus d’informations sur les changements entre Visual Studio 2015 et Visual Studio 2017, consultez le billet de blog Publier sur Azure dans Visual Studio 2017.For background on the changes between Visual Studio 2015 and Visual Studio 2017, see the blog post, Publish to Azure in Visual Studio 2017.

PrérequisPrerequisites

Pour cette procédure pas à pas, vous avez besoin d’un projet d’application web basé sur les infrastructures Bottle, Flask ou Django.For this walkthrough, you need a web app project based on the Bottle, Flask, or Django frameworks. Si vous n’avez pas encore de projet et que voulez essayer le processus de publication, créez un projet de test simple comme suit :If you don't yet have a project and would like to try the publishing process, create a simple test project as follows:

  1. Dans Visual Studio, sélectionnez Fichier > Nouveau > Projet, recherchez « Bottle », sélectionnez Bottle Web Project (Projet Web Bottle), spécifiez un nom et un chemin pour le projet, puis cliquez sur OK.In Visual Studio, select File > New > Project, search for "Bottle", select the Bottle Web Project, specify and name and a path for the project, click OK. (Le modèle Bottle est inclus dans la charge de travail de développement Python ; consultez Installation.)(The Bottle template is included with the Python development workload; see Installation.)

  2. Suivez les invites pour installer les packages externes, en sélectionnant Installer dans un environnement virtuel et votre interpréteur de base favori pour l’environnement virtuel.Follow the prompts to install external packages, selecting Install into a virtual environment and your preferred base interpreter for the virtual environment. Vous faites généralement ce choix en fonction de la version de Python installée sur App Service.You typically match this choice with the version of Python installed on App Service.

  3. Testez le projet localement en appuyant sur F5 ou en sélectionnant Déboguer > Démarrer le débogage.Test the project locally by pressing F5 or selecting Debug > Start Debugging.

Créer un service Azure App ServiceCreate an Azure App Service

La publication sur Azure nécessite un service App Service cible.Publishing to Azure requires a target App Service. Pour cela, vous pouvez créer un service App Service en utilisant un abonnement Azure ou vous pouvez utiliser un site temporaire.For this purpose you can create an App Service using an Azure subscription, or you can use a temporary site.

Si vous n’avez pas d’abonnement, commencez avec un compte Azure complet gratuit, qui inclut des crédits importants pour les services Azure.If you don't already have a subscription, start with a free full Azure account, which includes generous credits for Azure services. Envisagez également de vous inscrire à Visual Studio Dev Essentials, qui vous offre 25 $ de crédit par mois pendant un an.Also consider signing up for Visual Studio Dev Essentials, which gives you $25 credit every month for a full year.

Conseil

Azure demande une carte de crédit pour vérifier votre compte, mais la carte n’est pas débitée.Although Azure asks for a credit card to verify your account, the card is not charged. Vous pouvez également définir une limite de dépense égale à vos crédits gratuits pour être sûr qu’il n’y aura aucun frais supplémentaire.You can also set a spending limit equal to your free credits to guarantee that no extra charges occur. En outre, Azure fournit un niveau de plan App Service gratuit qui est idéal pour les applications de test simples, comme celle qui décrite dans la section suivante.In addition, Azure provides a free App Service plan tier that's ideal for simple test apps as described in the next section.

Utilisation d’un abonnementUsing a subscription

Avec un abonnement Azure actif, créez un service App Service avec une application web vide comme suit :With an active Azure subscription, create an App Service with an empty Web App as follows:

  1. Connectez-vous à portal.azure.com.Sign in at portal.azure.com.
  2. Sélectionnez +Nouveau, puis sélectionnez Web + Mobile et Application web.Select +New, then select Web + Mobile followed by Web App.
  3. Spécifiez un nom pour l’application web, laissez Groupe de ressources sur « Créer nouveau », puis choisissez Windows comme système d’exploitation.Specify a name for the web app, leave Resource Group to "Create New", and choose Windows as the operating system.
  4. Sélectionnez Plan/emplacement App Service, sélectionnez Créer nouveau, et spécifiez un nom et un emplacement.Select App service plan/location, select Create new, and specify a name and location. Sélectionnez ensuite Niveau tarifaire, faites défiler jusqu’à F1 Gratuit et sélectionnez-le, cliquez sur Sélectionner, sur OK puis sur Créer.Then select Pricing tier, scroll down to and select the F1 Free plan, press Select, followed by OK and then Create.
  5. (Facultatif) Une fois que le service App Service a été créé, accédez à celui-ci, sélectionnez Obtenir le profil de publication, puis enregistrez le fichier localement.(Optional) Once the App Service has been created, navigate to it, select Get publish profile, and save the file locally.

Utilisation d’un service App Service temporaireUsing a temporary App Service

Pour créer un service App Service temporaire sans avoir besoin d’un abonnement Azure, procédez comme suit :Create a temporary App Service without needing an Azure subscription as follows:

  1. Ouvrez votre navigateur au niveau du site try.azurewebsites.net.Open your browser to try.azurewebsites.net.
  2. Sélectionnez Application web pour le type d’application, puis sélectionnez Suivant.Select Web App for the app type, then select Next.
  3. Sélectionnez Site vide, puis Créer.Select Empty Site, followed by Create.
  4. Connectez-vous à l’aide de la connexion de réseau social de votre choix. Après un bref instant, votre site est prêt à l’adresse URL affichée.Sign in with a social login of your choice, and after a short time your site is ready at the displayed URL.
  5. Sélectionnez Télécharger le profil de publication, puis enregistrez le fichier .publishsettings, que vous utiliserez par la suite.Select Download publishing profile and save the .publishsettings file, which you use later.

Configurer Python sur Azure App ServiceConfigure Python on Azure App Service

Une fois que vous avez un service App Service avec une application web vide en cours d’exécution (dans votre abonnement ou sur un site gratuit), installez une version spécifique de Python comme décrit dans Gestion de Python sur Azure App Service.Once you have an App Service with an empty Web App running (either in your subscription or on a free site), install a chosen version of Python as described Managing Python on Azure App Service. Pour publier depuis Visual Studio 2017, enregistrez le chemin exact de l’interpréteur Python installé avec l’extension de site, comme décrit dans cet article.For publishing from Visual Studio 2017, record the exact path to the Python interpreter installed with the site extension as described in that article.

Si vous le souhaitez, vous pouvez également installer le package bottle en suivant le processus décrit dans ces instructions, car ce package est installé dans le cadre d’autres étapes de cette procédure pas à pas.If desired, you can also install the bottle package using the process in those instructions, as that package is installed as part of other steps in this walkthrough.

Publier sur App Service - Visual Studio 2017Publish to App Service - Visual Studio 2017

La publication sur Azure App Service à partir de Visual Studio 2017 copie seulement les fichiers de votre projet sur le serveur.Publishing to Azure App Service from Visual Studio 2017 copies only the files in your project to the server. Par conséquent, il est nécessaire de créer les fichiers nécessaires pour configurer l’environnement du serveur.It's necessary, therefore, to create the necessary files to configure the server environment.

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet, puis sélectionnez Ajouter, Nouvel élément... Dans la boîte de dialogue qui s’affiche, sélectionnez le modèle « Azure web.config (Fast CGI) », puis OK.In Visual Studio Solution Explorer, right-click the project and select *Add > New Item.... In the dialog that appears, selecting the "Azure web.config (Fast CGI)" template and select OK. Ceci crée un fichier web.config à la racine du projet.This creates a web.config file in your project root.

  2. Modifiez l’entrée PythonHandler dans web.config afin que le chemin corresponde au chemin d’installation de Python sur le serveur (voir Informations de référence sur IIS (iis.net) pour plus de détails).Modify the PythonHandler entry in web.config so that the path matches the Python installation on the server (see IIS Configuration Reference (iis.net) for exact details). Par exemple, pour Python 3.6.1 x64, l’entrée doit être la suivante :For example, for Python 3.6.1 x64 the entry should appear as follows:

    <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. Définissez l’entrée WSGI_HANDLER dans web.config de façon appropriée pour le framework que vous utilisez :Set the WSGI_HANDLER entry in web.config as appropriate for the framework you're using:

    • Bottle : ajoutez des parenthèses après app.wsgi_app, comme indiqué ci-dessous.Bottle: add parentheses after app.wsgi_app as shown below. Ceci est nécessaire, car cet objet est une fonction (voir app.py) et non pas une 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 : changez la valeur de WSGI_HANDLER en <project_name>.app, où <project_name> correspond au nom de votre projet.Flask: Change the WSGI_HANDLER value to <project_name>.app where <project_name> matches the name of your project. Vous pouvez trouver l’identificateur exact en examinant l’instruction from <project_name> import app dans runserver.py.You can find the exact identifer by looking at the from <project_name> import app statement in the runserver.py. Par exemple, si le projet est nommé « FlaskAzurePublishExample », l’entrée apparaît comme suit :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="FlaskAzurePublishExample.app"/>
      
    • Django : deux modifications sont nécessaires dans web.config pour les projets Django.Django: Two changes are needed to web.config for Django projects. Changez d’abord la valeur de WSGI_HANDLER en django.core.wsgi.get_wsgi_application() (l’objet est dans le fichier 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()"/>
      

      Ensuite, ajoutez l’entrée suivante en dessous de celle de WSGI_HANDLER, en remplaçant DjangoAzurePublishExample par le nom de votre projet :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="DjangoAzurePublishExample.settings" />
      
  4. Uniquement pour les applications Django : dans le fichier settings.py du projet Django, ajoutez votre domaine d’URL de site à ALLOWED_HOSTS comme illustré ci-dessous, en remplaçant « vspython-test-02.azurewebsites.net » par votre URL :Django apps only: In the Django project's settings.py file, add your site URL domain to ALLOWED_HOSTS as shown below, replacing 'vspython-test-02.azurewebsites.net' with your URL, of course:

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

    Si vous ne parvenez pas à ajouter votre URL au tableau, vous obtenez l’erreur suivante : « DisallowedHost pour / En-tête HTTP_HOST non valides : '<URL du site>'.Failure to add your URL to the array results in the error "DisallowedHost at / Invalid HTTP_HOST header: '<site URL>'. Il peut être nécessaire d’ajouter '<URL du site>' à ALLOWED_HOSTS. »You may need to add '<site URL>' to ALLOWED_HOSTS."

    Notez que lorsque le tableau est vide, Django autorise automatiquement « localhost », mais l’ajout de votre URL de production retire cette autorisation.Note that when the array is empty, Django automatically allows 'localhost', but adding your production URL removes that capabilities. Pour cette raison, vous pouvez souhaiter conserver des copies de développement et de production distinctes de settings.py, ou utiliser des variables d’environnement pour contrôler les valeurs d’exécution.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.

  5. Dans l’Explorateur de solutions, développez le dossier portant le même que votre projet, cliquez avec le bouton droit sur le dossier static, sélectionnez Ajouter > Nouvel élément..., sélectionnez le modèle « web.config des fichiers statiques Azure » et sélectionnez OK.In Solution Explorer, expand the folder named the same as your project, right-click the static folder, select Add > New Item..., select the "Azure static files web.config" template, and select OK. Cette action crée un autre fichier web.config dans le dossier static, qui désactive le traitement de Python pour ce dossier.This action creates another web.config in the static folder that disables Python processing for that folder. Cette configuration envoie des demandes de fichiers statiques au serveur web par défaut au lieu d’utiliser l’application Python.This configuration sends requests for static files to the default web server rather than using the Python application.

  6. Enregistrez votre projet puis, dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet et sélectionnez Publier.Save your project, then in Visual Studio Solution Explorer, right-click the project and select Publish.

    Commande Publier du menu contextuel d’un projet

  7. Sous l’onglet Publier qui apparaît, sélectionnez la cible de publication :In the Publish tab that appears, select the publishing target:

    a.a. Votre propre abonnement Azure : sélectionnez Microsoft Azure App Service, puis Sélectionner suivi de Publier.Your own Azure subscription: select Microsoft Azure App Service, then Select Existing followed by Publish. Une boîte de dialogue s’affiche, où vous pouvez sélectionner l’abonnement et le service App Service appropriés.A dialog appears in which you can select the appropriate subscription and app service. Si le service App Service n’apparaît pas, utilisez le profil de publication téléchargé comme décrit ci-dessous pour un service App Service temporaire.If the App Service doesn't appear, use the downloaded publishing profile as described below for a temporary APp Service.

    Publier sur Azure, Étape 1, Visual Studio 2017, abonnements existants

    b.b. Si vous utilisez un service App Service temporaire sur try.azurewebsites.net, ou si vous devez utiliser un profil de publication, sélectionnez le contrôle > pour rechercher Importer un profil, sélectionnez cette option, puis sélectionnez Publier.If you're using a temporary App Service on try.azurewebsites.net, or otherwise need to use a publishing profile, select the > control to find Import profile, select that option, then select Publish. L’emplacement du fichier .publishsettings précédemment téléchargé vous est alors demandé.This prompts for the location of the .publishsettings file downloaded earlier.

    Publier sur Azure, Étape 1, Visual Studio 2017, service App Service temporaire

  8. Visual Studio affiche l’état de la publication dans une fenêtre « Activité de publication Web » et la fenêtre Publier.Visual Studio displays publishing status in a "Web Publish Activity" window and the Publish window. Une fois la publication terminée, le navigateur par défaut s’ouvre sur l’URL du site.Once publishing is complete, the default browser opens on the site URL. L’URL apparaît également dans la fenêtre Publier.The URL is also shown in the Publish window.

  9. Quand le navigateur s’ouvre, vous pouvez voir le message, « Impossible d’afficher la page, car une erreur interne au serveur s’est produite. »When the browser opens, you may see the message, "The page cannot be displayed because an internal server error has occurred." Ce message indique que votre environnement Python sur le serveur n’est pas entièrement configuré, auquel cas vous devez procéder comme suit :This message indicates that your Python environment on the server is not fully configured, in which case do the following steps:

    a.a. Reportez-vous à nouveau à Gestion de Python sur Azure App Service et vérifiez qu’une extension de site Python appropriée est installée.Refer again to Managing Python on Azure App Service, making sure that you have an appropriate Python site extension installed.

    b.b. Vérifiez le chemin de l’interpréteur Python dans votre fichier web.config.Double-check the path to the Python interpreter in your web.config file. Le chemin doit correspondre exactement à l’emplacement d’installation de l’extension de site que vous avez choisie.The path must exactly match the install location of your chosen site extension.

    c.c. Utilisez la console Kudu pour mettre à niveau les packages répertoriés dans le fichier requirements.txt de votre application : accédez au même dossier Python que celui utilisé dans web.config, comme /home/python361x64, et exécutez la commande suivante, comme décrit dans la section Console Kudu :Use the Kudu console to upgrade any packages listed in your app's requirements.txt file: navigate to the same Python folder that's used in web.config, such as /home/python361x64, and run the following command as described in the Kudu console section:

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

    Si vous voyez des erreurs d’autorisation lors de l’exécution de cette commande, vérifiez que vous exécutez la commande dans le dossier de votre extension de site et non pas dans le dossier de l’une des installations de Python par défaut du service App Service.If you see permission errors when running this command, double-check that you're running the command in your site extension folder and not in the folder of one of App Service's default Python installations. Étant donné que vous ne pouvez pas modifier ces environnements par défaut, toute tentative d’installation de packages risque d’échouer.Because you can't modify those default environments, attempting to install packages certainly fails.

    d.d. Pour une sortie d’erreur détaillée, ajoutez la ligne suivante à web.config dans le nœud <system.webServer> :For detailed error output, add the following line to web.config within the <system.webServer> node, which provides more detailed error output:

    <httpErrors errorMode="Detailed"></httpErrors>
    

    e.e. Essayez en redémarrant le service App Service après l’installation de nouveaux packages.Try restarting the App Service after installing new packages. Un redémarrage n’est pas nécessaire lors de la modification de web.config, car App Service fait automatiquement un redémarrage quand web.config est modifié.A restart is not necessary when changing web.config, as App Service does an automatic restart whenever web.config changes.

    Conseil

    Si vous apportez des modifications au fichier requirements.txt de votre application, veillez à utiliser à nouveau la console Kudu pour installer des packages qui figurent maintenant dans ce fichier.If you make any changes to your app's requirements.txt file, be sure to again use the Kudu console to install any packages that are now listed in that file.

  10. Une fois que vous avez entièrement configuré l’environnement du serveur, actualisez la page dans le navigateur pour faire apparaître l’application web.Once you've fully configured the server environment, refresh the page in the browser and the web app should appear.

    Résultats de la publication d’applications Bottle, Flask et Django sur App Service

Publication sur App Service - Visual Studio 2015Publishing to App Service - Visual Studio 2015

Note

Vous pouvez trouver une courte vidéo de ce processus dans Visual Studio Python Tutorial: Building a Website (youtube.com, 3 minutes 10 secondes).A short video of this process can be found on Visual Studio Python Tutorial: Building a Website (youtube.com, 3m10s).

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet, puis sélectionnez Publier.In Solution Explorer, right-click the project select Publish.

  2. Dans la boîte de dialogue Publier, sélectionnez Microsoft Azure App Service :In the Publish dialog, select Microsoft Azure App Service:

    Publication sur Azure, étape 1

  3. Sélectionnez une cible :Select a target:

    • Si vous disposez d’un abonnement Azure, sélectionnez Microsoft Azure App Service comme cible de publication, puis dans la boîte de dialogue suivante, sélectionnez un App Service existant ou sélectionnez Nouveau pour en créer un.If you have an Azure subscription, select Microsoft Azure App Service as the publishing target, then in the following dialog select an existing App Service or select New to create a new one.
    • Si vous utilisez un site temporaire à partir de try.azurewebsites.net, sélectionnez Importer comme cible de publication, recherchez le fichier .publishsettings téléchargé à partir du site, puis sélectionnez OK.If you're using a temporary site from try.azurewebsites.net, select Import as the publishing target, then browse for the .publishsettings file downloaded from the site and select OK.
  4. Les détails d’App Service apparaissent dans l’onglet Connexion ci-dessous de la boîte de dialogue Publier.The App Service details appear in the Publish dialog's Connection tab below.

    Publication sur Azure, étape 2

  5. Sélectionnez Suivant > autant de fois que nécessaire pour examiner les paramètres supplémentaires.Select Next > as needed to review additional settings. Si vous prévoyez de déboguer à distance votre code Python sur Azure, vous devez définir Configuration sur Débogage.If you plan to remotely debug your Python code on Azure, you must set Configuration to Debug

  6. Sélectionnez Publier.Select Publish. Une fois votre application déployée sur Azure, votre navigateur par défaut s’ouvre au niveau de ce site.Once your application is deployed to Azure, your default browser opens on that site.

Dans le cadre de ce processus, Visual Studio effectue également les étapes suivantes :As part of this process, Visual Studio also does the following steps:

  • Créer un fichier web.config sur le serveur, qui contient des pointeurs appropriés vers la fonction wsgi_app de l’application et vers l’interpréteur Python 3.4 par défaut d’App Service.Create a web.config file on the server that contains appropriate pointers to the app's wsgi_app function and to App Service's default Python 3.4 interpreter.
  • Désactiver le traitement des fichiers dans le dossier static du projet (les règles concernées sont dans web.config).Turn off processing for files in the project's static folder (rules for this are in web.config).
  • Publier l’environnement virtuel sur le serveur.Publish the virtual environment to the server.
  • Ajouter un fichier web.debug.config et les outils de débogage ptvsd pour permettre le débogage distant.Add a web.debug.config file and the ptvsd debugging tools to enable remote debugging.

Comme indiqué précédemment, ces étapes automatiques simplifient le processus de publication, mais elles rendent plus difficile le contrôle de l’environnement Python.As noted earlier, these automatic steps simplify the publishing process but make it more difficult to control the Python environment. Par exemple, le fichier web.config est créé seulement sur le serveur, mais il n’est pas ajouté à votre projet.For example, the web.config file is created only on the server but not added to your project. Le processus de publication prend aussi plus de temps, car il copie tout l’environnement virtuel à partir de votre ordinateur de développement, au lieu de s’appuyer sur la configuration du serveur.The publishing process also takes longer because it's copying the whole virtual environment from your development computer rather than relying on the server configuration.

Enfin, vous pouvez préférer gérer votre propre fichier web.config et utiliser requirements.txt pour gérer directement les packages sur le serveur.Eventually you may want to maintain your own web.config file and use requirements.txt to maintain packages on the server directly. L’utilisation de requirements.txt garantit en particulier que vos environnements de développement et serveur correspondent toujours.Using requirements.txt, in particular, guarantees that your development and server environments always match.

Débogage distant sur Azure App ServiceRemote debugging on Azure App Service

Quand vous publiez une configuration de débogage depuis Visual Studio 2015, le processus crée automatiquement un fichier web.debug.config et ajoute un dossier ptvsd contenant les outils de débogage nécessaires.When you publish a Debug configuration from Visual Studio 2015, the process automatically creates a web.debug.config file and adds a ptvsd folder containing the necessary debugging tools.

Avec Visual Studio 2017, au lieu de cela, vous ajoutez ces composants directement au projet.With Visual Studio 2017, you instead add these components directly to the project. Cliquez avec le bouton droit sur le projet dans l’Explorateur de solutions, sélectionnez Ajouter > Nouvel élément..., puis sélectionnez le modèle « Fichier web.config de débogage Azure Remote ».Right-click the project in Solution Explorer, select Add > New Item..., and select the "Azure Remote debugging web.config" template. Un fichier web.debug.config de débogage et le dossier des outils ptvsd apparaît dans votre projet.A debugging web.debug.config file and the ptvsd tool folder appear in your project.

Une fois que ces fichiers sont déployés sur le serveur (automatiquement avec Visual Studio 2015 ; lors de votre publication suivante avec Visual Studio 2017), vous pouvez suivre les instructions pour le débogage distant Azure.Once these files are deployed to the server (automatically with Visual Studio 2015; on your next publish with Visual Studio 2017), you can follow the instructions for Azure remote debugging.