Flask ne peut pas être RESTful avec les applications d'API Azure

introduction

Quoi qu'il en soit, python est très facile à écrire une simple application API Web. Flask est un framework qui tire parti de cette commodité et facilite le routage de chemin. Un exemple d'écriture d'applications API en python avec Azure App Service est également disponible dans Flask (https://docs.microsoft.com/ja-jp/azure/app-service-web/app-service-web) -get-started-python). Mon travail principal est java, mais la plupart des programmes sans contrainte de langage sont écrits en python, et si je déploie une API à l'aide de Flask vers des applications API avec la même colle, cela ne fonctionne pas.

Problèmes et contre-mesures

un événement

Ce qui n'a pas fonctionné, c'est que @ app.route () de Flask ne fonctionnait pas. Pour être précis, @ app.route (" / ") fonctionne, mais quelque chose comme @ app.route (" / user / <id> / status ") ne fonctionne pas. GET / user / 1 / status HTTP / 1.1 renvoie avec IIS (?) 404. Ce qui ne va pas avec cela, c'est que (probablement) Web Apps a IIS sur le devant et est envoyé à Flask en python, mais par défaut, seul "/" est passé à Flask, / user Je pense que c'est parce que les chemins comme / 1 / status sont hors de portée [^ 1]. [^ 1]: Je suis tellement nouveau dans Azure App Service que je ne sais même pas comment lire le journal, mais le fantôme le chuchote.

politique

S'il s'agit de java, cela est réalisé en enregistrant le servlet à traiter avec le modèle d'url dans le conteneur d'application Web, et s'il s'agit de cgi, le serveur HTTP est mappé avec le gestionnaire de requêtes. Je peux donc imaginer que j'enseigne aux Web Apps comment se déplacer. Selon Configuration de Python avec les applications Web Azure App Service

Pour spécifier la manière dont le serveur traite la demande, vous devez créer un fichier web.config. Si le référentiel a un fichier web.x.y.config (où x.y est le runtime Python de votre choix), Azure copiera automatiquement le fichier approprié en tant que web.config.

une. Cette fois, j'essayais de l'exécuter avec python3.4, donc je pense que je devrais faire quelque chose avec web.3.4.config.

Solution

Tout d'abord, ** Je ne peux pas assumer la responsabilité même si je lis ceci et que je le mets en œuvre et que la sécurité devient sournoise, alors veuillez juger s'il n'y a pas de problème par vous-même (lecture de la barre) **

Alors, comment le faire, comme décrit dans [l'article] précédent (https://docs.microsoft.com/ja-jp/azure/app-service-web/web-sites-python-configure#webconfig)

xml:web.3.4.config


<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="WSGI_ALT_VIRTUALENV_HANDLER" value="app.wsgi_app" />
    <add key="WSGI_ALT_VIRTUALENV_ACTIVATE_THIS"
         value="D:\home\site\wwwroot\env\Scripts\python.exe" />
    <add key="WSGI_HANDLER"
         value="ptvs_virtualenv_proxy.get_venv_handler()" />
    <add key="PYTHONPATH" value="D:\home\site\wwwroot" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
      <remove name="Python27_via_FastCGI" />
      <remove name="Python34_via_FastCGI" />
      <add name="Python FastCGI"
           path="handler.fcgi"
           verb="*"
           modules="FastCgiModule"
           scriptProcessor="D:\Python34\python.exe|D:\Python34\Scripts\wfastcgi.py"
           resourceType="Unspecified"
           requireAccess="Script" />
    </handlers>
    <rewrite>
      <rules>
        <rule name="Static Files" stopProcessing="true">
          <conditions>
            <add input="true" pattern="false" />
          </conditions>
        </rule>
        <rule name="Configure Python" stopProcessing="true">
          <match url="(.*)" ignoreCase="false" />
          <conditions>
            <add input="{REQUEST_URI}" pattern="^/static/.*" ignoreCase="true" negate="true" />
          </conditions>
          <action type="Rewrite" url="handler.fcgi/{R:1}" appendQueryString="true" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Si tel est le cas, il semble que le routage comme @ app.route (" / user / <id> / status ") fonctionnera correctement [^ 2]. La définition de <rule name =" Configure Python "stopProcessing =" true "> ~ </ rule> dans <system.webServer> Hogehogehoge </ system.webServer> accroche le modèle d'URL et python Il semble que j'essaie de le donner, mais j'essaye de vérifier à nouveau l'opération. Peut-être que vous pouvez voir comment cela fonctionne en lisant la documentation IIS.

[^ 2]: Bien sûr, vous devez considérer que le contenu statique peut également être géré par Flask.

Recommended Posts

Flask ne peut pas être RESTful avec les applications d'API Azure
Essayez de créer une API RESTful avec MVC à l'aide de Flask 1.0.2
API avec Flask + uWSGI + Nginx
TensorFlow 2.2 ne peut pas être installé avec Python 3.8!
Persistez le serveur d'API Flask avec Forever
Stockage de table Azure avec l'application PTVS Flask
[Python] Créez rapidement une API avec Flask
Essayez l'authentification OAuth Slack avec Flask (API Slack V2)
Surveillez les applications Python avec l'APM de New Relic (Flask)
Extraction de texte (API de lecture) avec l'API Azure Computer Vision (Python3.6)