天天看點

【Azure 應用服務】App Service For Windows 環境中部署Python站點後,如何繼續通路靜态資源檔案呢(Serving Static Files)?

問題描述

當建立一個App Service 後,運作時環境和版本選擇Windows 和 Python 3.6. 登入Kudu 站點檢視,預設的檔案有 web.config, hostingstart-python.py, hostingstart-python.html,  在配置檔案中,通過pythonpath來指定啟動目錄,而 WSGI_HANDLER 則指定啟動的py檔案為 hostingstart-python.py.

web.config

<configuration>
  <appSettings>
    <add key="pythonpath" value="%SystemDrive%\home\site\wwwroot" />
    <add key="WSGI_HANDLER" value="hostingstart-python.application" />
  </appSettings>
</configuration>      

hostingstart-python.py 檔案中定義了應用的傳回内容為hostingstart-python.html中的内容

import sys
import platform

def application(environ, start_response):
    start_response(b'200 OK', [(b'Content-Type', b'text/html')])
    with open ("hostingstart-python.html", "r") as hostingstart_file:
        hosting = hostingstart_file.read()
        yield hosting.encode('utf8').replace(b'PYTHON_VERSION', platform.python_version().encode('utf8'))
       
      

hostingstart-python.html 

<html>
<body>test from other root folder start Python project from wwwroot....</body>
</html>      

當通路站點時候,就會把 hostingstart-python.html 中的内容顯示到首頁。但是當站點中也需要部署一些靜态html檔案時,發現不管如何修改URL,始終傳回的内容都是hostingstart-python.html 。

【Azure 應用服務】App Service For Windows 環境中部署Python站點後,如何繼續通路靜态資源檔案呢(Serving Static Files)?

由于Python應用的啟動檔案中強制傳回的内容為hostingstart-python.html,而且沒有配置route,是以不管是什麼URL通路到此站點,永遠輸出都是同樣内容,因為處理請求的程序是Python.exe, 而非w3wp.exe

【Azure 應用服務】App Service For Windows 環境中部署Python站點後,如何繼續通路靜态資源檔案呢(Serving Static Files)?

問題解決

如何使用IIS來處理靜态頁面的請求呢?實作Python 站點也能通過URL通路到正确的靜态檔案(Serving Static Files): 有的。在靜态檔案夾中添加 web.config 檔案,并添加以下内容:

<?xml version="1.0"?>  
<configuration>  
    <system.webServer>
        <handlers>
           <clear />
            <add 
                name="StaticFile"
                path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" 
                resourceType="Either" 
                requireAccess="Read" />
        </handlers>
    </system.webServer>
</configuration>        
  • 它告訴IIS這是一個靜态資源檔案,隻需要StaticFileModule 等就可以解析,不需要使用Python wfastcgi子產品

注意:添加web.config檔案後,需要重新開機站點(App Service)。 然後就可以自由檢視靜态頁面内容。

【Azure 應用服務】App Service For Windows 環境中部署Python站點後,如何繼續通路靜态資源檔案呢(Serving Static Files)?

附錄:另外也可以通過在wwwroot目錄中的web.config中配置URL重寫的規則,來實作對靜态檔案的通路

添加如下的Rewrite規則:

<system.webServer>
    <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>      

參考資料

Django app with HttpPlatformHandler in Azure App Services (Windows) (Serving Static Files): https://azureossd.github.io/2017/09/01/django-app-with-httpplatformhandler-in-azure-app-services-windows/

如何在 Azure 應用服務 (Windows) 上設定 Python 環境:https://docs.microsoft.com/zh-cn/visualstudio/python/managing-python-on-azure-app-service?view=vs-2019

當在複雜的環境中面臨問題,格物之道需:濁而靜之徐清,安以動之徐生。 雲中,恰是如此!

繼續閱讀