問題描述
使用Flask架構部署Python代碼,如何通路其中的靜态檔案呢?如static問價夾中的圖像資源,同時如何在代碼中讀取txt檔案中的内容呢?是相對路徑或者是絕對路徑呢?
實驗步驟
在App Service (Windows)環境中部署Flask Python應用時,需要考慮注意參考文檔“釋出到 Windows 上的 Azure 應用服務”, Python項目的Web.config内容為:
<system.webServer>
<handlers>
<add name="PythonHandler" path="*" verb="*" modules="FastCgiModule"
scriptProcessor="D:\home\Python361x64\python.exe|D:\home\Python361x64\wfastcgi.py"
resourceType="Unspecified" requireAccess="Script"/>
</handlers>
</system.webServer>
而特别對于Flash項目,需要添加項目的啟動配置:
Flask:将值更改為
WSGI_HANDLER
,其中
<project_name>.app
與項目名稱比對。 可通過檢視
<project_name>
中的
runserver.py
語句,找到準确的辨別符。 例如,如果項目命名為“FlaskAzurePublishExample”,則該條目如下所示:
from <project_name> import app
<!-- Flask apps only: change the project name to match your app --> <add key="WSGI_HANDLER" value="FlaskAzurePublishExample.app"/>
以下的實驗是在通過相對路徑通路靜态圖檔:
- 首先項目路徑如下(項目釋出到Azure後,通過Kudu站點檢視項目檔案路徑)
-
- 靜态檔案放在了static這個檔案夾下
- test.py運作代碼如下:
-
from flask import Flask,render_template app = Flask(__name__, static_folder='', static_url_path='') @app.route('/') def index(): return render_template('index.html') if __name__ == '__main__': app.run()
- 通路的時候用url_for函數,templates檔案夾下的index.html如下:
- 測試結果,直接通路站點根目錄時可以通路到靜态檔案
以上是通過HTML通路項目中的靜态資源檔案,如果是需要通過代碼的方式讀取txt檔案中的内容,由于可能存在釋出後的相對路徑與本地測試時候路徑不一緻,是以建議使用部署在App Service中的絕對路徑。如:open(‘D:/hone/site/wwwroot/static/test.txt’,’r’)
但如果一定需要使用相對路徑,這可以考慮使用App Service Home路徑的環境變量,如:open(‘%HOME%/site/wwwroot/static/test.txt,’r’) 。
參考資料
釋出到 Windows 上的 Azure 應用服務:https://docs.microsoft.com/zh-cn/visualstudio/python/publish-to-app-service-windows?view=vs-2019#publish-to-app-service---visual-studio-2017-and-later
當在複雜的環境中面臨問題,格物之道需:濁而靜之徐清,安以動之徐生。 雲中,恰是如此!