Configurer des applications web Python pour IIS

Lorsque vous utilisez Internet Information Services (IIS) comme serveur web sur un ordinateur Windows (y compris des machines virtuelles Windows sur Azure), vous devez configurer l’application web Python pour permettre à IIS de traiter correctement le code Python. La configuration est effectuée via les paramètres du fichier web.config pour l’application web Python. Cet article décrit comment configurer les paramètres nécessaires.

Prérequis

  • Python sous Windows installé. Pour exécuter une application web, commencez par installer directement la version requise de Python sur l’ordinateur hôte Windows (voir Installer des interpréteurs Python).

    • Identifiez l'emplacement de l’interpréteur python.exe. Dans un souci de commodité, vous pouvez ajouter cet emplacement à votre variable d’environnement PATH.
  • Packages nécessaires installés. Pour un hôte dédié, vous pouvez utiliser l’environnement Python global pour exécuter votre application plutôt qu’un environnement virtuel. Il vous sera alors possible d’installer tous les éléments requis par votre application dans l’environnement global en exécutant la commande pip install -r requirements.txt.

Définir web.config pour le faire pointer vers l’interpréteur Python

Le fichier web.config de votre application Python indique au serveur web IIS (version 7 ou ultérieure) qui s’exécute sur Windows comment il doit gérer les requêtes Python à travers HttpPlatformHandler (recommandé) ou FastCGI. Les versions 2015 et antérieures de Visual Studio font ces modifications automatiquement. Pour Visual Studio 2017 et ultérieur, vous devez modifier le fichier web.config manuellement.

Si votre projet ne contient pas encore de fichier web.config, vous pouvez en ajouter un en cliquant avec le bouton droit de la souris sur le répertoire du projet, en sélectionnant Ajouter > nouvel élément et en recherchant web.config ou en créant un fichier XML web.config vierge.

Configurer le HttpPlatformHandler

Le module HttpPlatform passe les connexions de socket directement à un processus Python autonome. 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. Cette approche est généralement effectuée à l’aide d’une infrastructure web Python, telle que Flask ou Django. Vous spécifiez le script dans l’élément <httpPlatform> du fichier web.config. L’attribut processPath pointe vers l’interpréteur Python de l’extension de site. L’attribut arguments pointe vers votre script de démarrage qui exécute un serveur web local, dans ce cas runserver.py, et tous les arguments que vous souhaitez fournir :

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

Dans cet exemple, la variable d’environnement HTTP_PLATFORM_PORT contient le port sur lequel votre serveur local doit écouter les connexions à partir de localhost. Cet exemple montre également comment créer une autre variable d’environnement, SERVER_PORT. Vous pouvez créer et affecter des variables d’environnement en fonction de vos besoins.

Configurer le gestionnaire FastCGI

FastCGI est une interface qui fonctionne au niveau de la demande. IIS reçoit les connexions entrantes et transmet chaque demande à une application WSGI exécutée dans un ou plusieurs processus Python persistants.

Remarque

Nous vous recommandons d’utiliser HttpPlatformHandler pour configurer vos applications, car le projet WFastCGI n’est plus tenu à jour.

Pour utiliser FastCGI, commencez par installer et configurer le package wfastcgi suivant les instructions figurant dans pypi.org/project/wfastcgi/.

Ensuite, modifiez le fichier web.config de votre application en ajoutant les chemins d’accès complets à l'exécutable python.exe et au fichier wfastcgi.py dans la clé PythonHandler. Les étapes suivantes supposent que Python est installé dans le dossier c:\python36-32 et que le code de l’application se trouve dans le dossier c:\home\site\wwwroot. Ajustez ces valeurs selon vos chemins d'accès en conséquence.

  1. Modifiez l’entrée PythonHandler dans le fichier web.config afin que le chemin d'accès corresponde à l’emplacement d’installation de Python. Pour plus d’informations, consultez la Référence de configuration IIS (iis.net).

    <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. Dans la section <appSettings> du fichier web.config, ajoutez les clés WSGI_HANDLER, WSGI_LOG (facultatif), et 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>
    

    Ces valeurs <appSettings> sont accessibles à votre application comme variables d’environnement :

    • La valeur de la clé PYTHONPATH peut être librement étendue, mais elle doit inclure la racine de votre application.
    • La clé WSGI_HANDLER doit pointer vers une application WSGI importable à partir de votre application.
    • La clé WSGI_LOG est facultative, mais elle est recommandée pour le débogage de votre application.
  3. Définissez l’entrée WSGI_HANDLER dans le fichier web.config de façon appropriée pour le framework que vous utilisez :

    • Bottle : ajoutez des parenthèses après la valeur app.wsgi_app, comme indiqué dans cet exemple. Les parenthèses sont nécessaires, car l’objet est une fonction plutôt qu’une variable. Vous pouvez voir la syntaxe dans le fichier app.py.

      <!-- 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. Vous pouvez trouver l’identificateur exact en examinant l’instruction from <project_name> import app dans le fichier runserver.py. Par exemple, si le projet est nommé FlaskAzurePublishExample, l’entrée apparaît comme suit :

      <!-- 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 le fichier web.config pour les projets Django.

      • Remplacez la valeur WSGI_HANDLER par django.core.wsgi.get_wsgi_application(). L’objet se trouve dans le fichier wsgi.py.

        <!-- Django apps only -->
        <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()"/>
        
      • Ajoutez l’entrée suivante immédiatement après l’entrée de la clé WSGI_HANDLER. Remplacez la valeur DjangoAzurePublishExample par le nom de votre projet :

        <add key="DJANGO_SETTINGS_MODULE" value="django_iis_example.settings" />
        
  4. Applications Django uniquement : dans le fichier settings.py du projet Django, ajoutez votre domaine d’URL de site ou votre adresse IP à l’entrée ALLOWED_HOSTS. Remplacez « 1.2.3.4 » par votre URL ou adresse IP :

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

    Si vous n’ajoutez pas votre URL aux résultats du tableau, l’erreur suivante s’affiche :

    DisallowedHost at / Invalid HTTP_HOST header: '\<site URL\>'. You might need to add '\<site URL\>' to ALLOWED_HOSTS.
    

Lorsque le tableau est vide, Django autorise automatiquement 'localhost' et '127.0.0.1' en tant qu’hôtes. Si vous ajoutez votre URL de production, ces sites hôtes ne sont pas automatiquement autorisés. Pour cette raison, vous pouvez conserver des copies de développement et de production distinctes du fichier settings.py, ou utiliser des variables d’environnement pour contrôler les valeurs d’exécution.

Déployer sur IIS ou sur une machine virtuelle Windows

Lorsque vous disposez du bon fichier web.config dans votre projet, vous pouvez publier sur l’ordinateur exécutant IIS à partir de l'Explorateur de solutions. Cliquez avec le bouton droit sur le projet, sélectionnez Publier, puis IIS, FTP, etc.. Dans ce cas, Visual Studio copie uniquement les fichiers projet sur le serveur. Vous êtes responsable de toutes les configurations côté serveur.