問題描述
當建立一個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