【Azure 應用服務】App Service For Windows 環境中部署Python站點後,如何繼續訪問靜態資原始檔呢(Serving Static Files)?

路邊兩盞燈 發表於 2021-09-02
Python

問題描述

當建立一個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