[PYTHON] Flask kann mit Azure API Apps nicht RESTful sein

Einführung

Wie auch immer, Python ist sehr einfach, eine einfache Web-API-Anwendung zu schreiben. Flask ist ein Framework, das diesen Komfort nutzt und das Routing von Pfaden vereinfacht. Ein Beispiel zum Schreiben von API-Apps in Python mit Azure App Service ist auch in Flask verfügbar (https://docs.microsoft.com/ja-jp/azure/app-service-web/app-service-web). -get-Started-Python). Meine Hauptaufgabe ist Java, aber die meisten sprachunabhängigen Programme sind in Python geschrieben. Wenn ich eine API mit Flask für API-Apps mit demselben Klebstoff bereitstelle, funktioniert dies nicht.

Probleme und Gegenmaßnahmen

Veranstaltung

Was nicht funktionierte war, dass Flask's @ app.route () nicht funktionierte. Um genau zu sein, funktioniert "@ app.route (" / ")", aber so etwas wie "@ app.route (" / user / / status ")" funktioniert nicht. GET / user / 1 / status HTTP / 1.1 wird mit IIS (?) 404 zurückgegeben. Was daran falsch ist, ist, dass (wahrscheinlich) Web Apps IIS auf der Vorderseite hat und an Flask of Python versendet, aber standardmäßig wird nur "/" an Flask, / user übergeben Ich denke, das liegt daran, dass Pfade wie / 1 / status außerhalb des Gültigkeitsbereichs liegen [^ 1]. [^ 1]: Ich bin so neu im Azure App Service, dass ich nicht einmal weiß, wie man das Protokoll liest, aber der Geist flüstert es.

Politik

Wenn dies Java ist, wird dies durch Registrieren des zu verarbeitenden Servlets mit URL-Muster im Webanwendungscontainer realisiert. Wenn es sich um CGI handelt, ordnet HTTP Server dem Anforderungshandler zu. Ich kann mir also vorstellen, dass ich Web Apps das Bewegen beibringe. Laut Konfigurieren von Python mit Azure App Service-Webanwendungen

Um anzugeben, wie der Server die Anforderung verarbeitet, müssen Sie eine web.config-Datei erstellen. Wenn das Repository über eine web.x.y.config-Datei verfügt (wobei x.y die Python-Laufzeit Ihrer Wahl ist), kopiert Azure die entsprechende Datei automatisch als web.config.

ein. Dieses Mal habe ich versucht, es mit python3.4 auszuführen, daher denke ich, ich sollte etwas mit web.3.4.config machen.

Lösung

Zuallererst ** kann ich keine Verantwortung übernehmen, selbst wenn ich dies lese und implementiere und die Sicherheit schlampig wird. Bitte beurteilen Sie selbst, ob es kein Problem gibt (Lesen in der Leiste) **

Wie es geht, wie im vorherigen [Artikel] beschrieben (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>

Wenn dies der Fall ist, scheint das Routing wie "@ app.route (" / user / / status ")" ordnungsgemäß zu funktionieren [^ 2]. Die Definition von <rule name =" Configure Python "stopProcessing =" true "> ~ </ rule> in <system.webServer> Hogehogehoge </ system.webServer> verknüpft das URL-Muster und Python Es scheint, dass ich versuche, es zu geben, aber ich versuche, den Vorgang erneut zu überprüfen. Vielleicht können Sie sehen, wie es funktioniert, indem Sie die IIS-Dokumentation lesen.

[^ 2]: Natürlich müssen Sie berücksichtigen, dass statische Inhalte auch von Flask verarbeitet werden können.

Recommended Posts

Flask kann mit Azure API Apps nicht RESTful sein
Versuchen Sie, mit MVC eine RESTful-API mit Flask 1.0.2 zu erstellen
API mit Flask + uWSGI + Nginx
TensorFlow 2.2 kann nicht mit Python 3.8 installiert werden!
Behalten Sie den Flask API-Server für immer bei
Azure-Tabellenspeicher mit PTVS Flask-App
[Python] Erstellen Sie schnell eine API mit Flask
Versuchen Sie eine lockere OAuth-Authentifizierung mit einem Kolben (Slack API V2).
Überwachen Sie Python-Apps mit dem APM (Flask) von New Relic.
Textextraktion (Lese-API) mit Azure Computer Vision-API (Python3.6)