問題描述
當建立一個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
當在複雜的環境中面臨問題,格物之道需:濁而靜之徐清,安以動之徐生。 雲中,恰是如此!