問題描述
當建立一個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 。
由於Python應用的啟動檔案中強制返回的內容為hostingstart-python.html,而且沒有配置route,所以不管是什麼URL訪問到此站點,永遠輸出都是同樣內容,因為處理請求的程序是Python.exe, 而非w3wp.exe
問題解決
如何使用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)。 然後就可以自由檢視靜態頁面內容。
附錄:另外也可以通過在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