如果您只想移動(dòng)靜態(tài)文件的位置,那么最簡(jiǎn)單的方法是在構(gòu)造函數(shù)中聲明路徑。在下面的示例中,我已將模板和靜態(tài)文件移動(dòng)到名為 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
作為靜態(tài)文件。template_folder='web/templates'
類似地,這會(huì)更改
模板文件夾。使用此方法,以下 URL 將返回 CSS 文件:
<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
最后,這是文件夾結(jié)構(gòu)的快照,其中 flask_server.py
是 Fl??ask 實(shí)例:
在生產(chǎn)中,在應(yīng)用程序前面配置 HTTP 服務(wù)器(Nginx、Apache 等),以處理來自靜態(tài)文件夾的 /static
請(qǐng)求。專用 Web 服務(wù)器非常擅長(zhǎng)高效地提供靜態(tài)文件,盡管在低容量時(shí)您可能不會(huì)注意到與 Flask 相比的差異。
Flask 會(huì)自動(dòng)創(chuàng)建一個(gè) /static/
路由,該路由將為 Python 旁邊的 static
文件夾下的任何 filename
提供服務(wù)定義 Flask 應(yīng)用程序的模塊。使用url_for
鏈接到靜態(tài)文件:url_for('static', filename='js/analytics.js')
您還可以使用 send_from_directory
來提供文件從您自己的路線中的目錄中。這需要一個(gè)基本目錄和一個(gè)路徑,并確保該路徑包含在該目錄中,這樣可以安全地接受用戶提供的路徑。如果您想在提供文件之前檢查某些內(nèi)容,例如登錄用戶是否具有權(quán)限,這可能很有用。
from flask import send_from_directory @app.route('/reports/<path:path>') def send_report(path): return send_from_directory('reports', path)
請(qǐng)勿將 send_file
或 send_static_file
與用戶提供的路徑一起使用。這將使您面臨目錄遍歷攻擊。 send_from_directory
旨在安全地處理已知目錄下用戶提供的路徑,如果路徑嘗試轉(zhuǎn)義該目錄,則會(huì)引發(fā)錯(cuò)誤。
如果您在內(nèi)存中生成文件而不將其寫入文件系統(tǒng),則可以將 BytesIO
對(duì)象傳遞給 send_file
將其作為文件提供。在這種情況下,您需要將其他參數(shù)傳遞給 send_file
,因?yàn)樗鼰o法推斷文件名或內(nèi)容類型等內(nèi)容。