P粉1555517282023-08-24 12:55:28
如果您只想移動靜態檔案的位置,那麼最簡單的方法就是在建構函式中宣告路徑。在下面的範例中,我已將範本和靜態檔案移至名為 web
的子資料夾中。
app = Flask(__name__, static_url_path='', static_folder='web/static', template_folder='web/templates')
static_url_path=''
從 URL 中刪除所有前面的路徑。 static_folder='web/static'
提供在資料夾中找到的任何文件
web/static
作為靜態檔案。 template_folder='web/templates'
類似地,這會更改
模板資料夾。 使用此方法,以下 URL 將傳回 CSS 檔案:
<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
最後,這是資料夾結構的快照,其中 flask_server.py
是 Flask 實例:
P粉2129717452023-08-24 09:31:38
在生產中,在應用程式前面配置 HTTP 伺服器(Nginx、Apache 等),以處理來自靜態資料夾的 /static
請求。專用 Web 伺服器非常擅長有效率地提供靜態文件,儘管在低容量時您可能不會注意到與 Flask 相比的差異。
Flask 會自動建立一個/static/
路由,該路由將為Python 旁的static
資料夾下的任何filename
提供服務定義Flask 應用程式的模組。使用url_for
連結到靜態檔案:url_for('static', filename='js/analytics.js')
您也可以使用 send_from_directory
來提供檔案從您自己的路線中的目錄。這需要一個基本目錄和一個路徑,並確保該路徑包含在該目錄中,這樣可以安全地接受使用者提供的路徑。如果您想在提供文件之前檢查某些內容,例如登入使用者是否具有權限,這可能很有用。
from flask import send_from_directory @app.route('/reports/<path:path>') def send_report(path): return send_from_directory('reports', path)
請勿將 send_file
或 send_static_file
與使用者提供的路徑一起使用。這將使您面臨目錄遍歷攻擊。 send_from_directory
旨在安全地處理已知目錄下使用者提供的路徑,如果路徑嘗試轉義該目錄,則會引發錯誤。
如果您在記憶體中產生檔案而不將其寫入檔案系統,則可以將BytesIO
物件傳遞給send_file
將其作為檔案提供。在這種情況下,您需要將其他參數傳遞給 send_file
,因為它無法推斷檔案名稱或內容類型等內容。