Partager via


Configurer des applications web Python pour IIS

Lorsque vous utilisez Internet Information Services (IIS) comme serveur web sur un ordinateur Windows (y compris 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 explique comment configurer les paramètres nécessaires.

Conditions préalables

  • Python sur Windows installé. Pour exécuter une application web, installez d’abord votre version requise de Python directement sur l’ordinateur hôte Windows, comme décrit dans Installer des interpréteurs Python.

    • Identifiez l’emplacement de l’interpréteur python.exe. Pour plus de commodité, vous pouvez ajouter cet emplacement à votre variable d’environnement PATH.
  • Packages requis 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. En conséquence, vous pouvez installer toutes les exigences de votre application dans l’environnement global en exécutant la commande pip install -r requirements.txt.

Définissez web.config pour pointer vers l’interpréteur Python

Le fichier web.config de votre application Python indique au serveur web IIS (version 7 ou ultérieure) s’exécutant sur Windows sur la façon dont il doit gérer les requêtes Python via HttpPlatformHandler (recommandé) ou FastCGI. Visual Studio versions 2015 et antérieures effectuent automatiquement ces modifications. Pour Visual Studio 2017 et versions ultérieures, 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 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 vide.

Option 1 : Configurer le HttpPlatformHandler

Le module HttpPlatform transmet les connexions de socket directement à un processus Python autonome. Ce pass-through 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 des besoins.

Option 2 : Configurer le gestionnaire FastCGI

Vous pouvez également utiliser FastCGI pour configurer vos applications. FastCGI est une interface qui fonctionne au niveau de la requête. IIS reçoit des connexions entrantes et transfère chaque requête à une application WSGI s’exécutant dans un ou plusieurs processus Python persistants.

Remarque

Bien que vous puissiez configurer votre projet à l’aide de FastCGI, nous vous recommandons d’utiliser httpPlatformHandler pour configurer vos applications, car le projet WFastCGI n’est plus conservé et peut entraîner des bogues.

Pour utiliser FastCGI, commencez par installer et configurer le package wfastcgi comme décrit dans pypi.org/project/wfastcgi/.

Ensuite, modifiez le fichier web.config de votre application pour inclure les chemins complets vers l’exécutable python.exe et le fichier wfastcgi.py dans la clé de 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 en fonction de vos chemins d’accès.

  1. Modifiez l’entrée PythonHandler dans le fichier web.config afin que le chemin corresponde à l’emplacement d’installation de Python. Pour plus d’informations, consultez 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 des clés pour 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 disponibles pour votre application en tant que variables d’environnement :

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

    • Bottle: ajoutez des parenthèses après la valeur de app.wsgi_app, comme illustré 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: remplacez la valeur WSGI_HANDLER par <project_name>.app<project_name> correspond au nom de votre projet. Vous trouverez 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 au 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 souhaiterez peut-être 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 une machine virtuelle Windows

Lorsque vous disposez du fichier web.config correct 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 sélectionnez 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.