Python Web Flask — 使用靜態檔案

Niagara Falls, Canada, photo by Sean Yeh

哪些是靜態檔案

就一個網站應用程式來說,所謂的靜態檔案泛指瀏覽器在呈現完整畫面時所需要的資源檔案,如JavaScript檔案、CSS樣式表、img圖像等,都是靜態檔案。這些檔案一般都是由網站應用程式直接提供給使用者端。

如何在Flask裡面使用靜態檔案

如何有效地組織靜態檔案始終是所有網站框架所關心的問題。Flask也不例外,它提供了一種在應用程式中組織靜態文件的特定方法,如下所示:

在這個結構裡面,假設我們想要在template樣板中呈現logo.png時,我們可以使用以下方式來引用靜態檔案:

<img src='/static/images/logo.png'>

我們把圖片放在base.html裡面,Navbar的前面,程式碼如下:

啟動伺服器執行後,輸入網址瀏覽的結果如下:

因此,假設我們在應用程式的根目錄有一個名為static的資料夾,Flask預設會自動讀取該static資料夾裡面的內容,我們不需要額外進行其他任何的設定。在目前這個例子裡,static的資料夾是指與hello.py位於同一資料層級的位置。

static_folder的使用

如果我們不想使用預設的static位置作為靜態檔案資料夾時,該如何處理?

這時候,我們可以在hello.py中定義Flask應用程式時,為應用程式提供一個名為static_folder的參數,如下所示:

app = Flask(__name__, static_folder='/path/to/static/folder')

比如說,我們可以指定靜態檔案為views資料夾裡面assets子資料夾:

app = Flask(__name__, static_folder='views/assets/')

資料夾結構如下:

在這個結構裡面,我們如果一樣要在template樣板中呈現logo.png時,必須修改為以下方式來引用靜態檔案:

<a class="navbar-brand" href="#">    <img src='logo.png'> Navbar</a>

static_url_path的使用

我們可以使用static_url_path的值來改變路徑。方法是將程式碼進行如下修改:

app = Flask(__name__, static_url_path='/otherstatic',static_folder='/path/to/static/folder')

在前面的原始碼中,static是指應用程式上的static_url_path的值。這時候,若要顯示靜態檔案,我們需要使用以下方式:

<img src='/otherstatic/logo.png'>

接下來,我們實際測試一下。承上面例子,資料夾結構如下,跟之前一樣沒有改變,實際上logo.png放在views/assets/裡面:

我們需要修改程式碼如下,其中static是指img:

app = Flask(__name__, static_url_path='/img',static_folder='views/assets/')

因此,我們如果一樣要在template樣板中呈現logo.png時,必須修改為以下方式來引用靜態檔案:

<a class="navbar-brand" href="#"><img src='img/logo.png'> Navbar</a>

執行看看,並且檢視HTML原始碼:

你可以發現,使用<img src=’img/logo.png’>可以取得logo圖片。實際上我們知道logo圖片,並不是放在img資料夾裡面,在真實的檔案結構中,根本沒有img這個資料夾,是我們透過static_url_path=’/img’ 語法「虛擬」出來的一個資料夾。

結語

綜合以上,我們發現static_folder主要是用來改變url的目錄,預設的目錄是static,可以透過static_folder這個變數來改變靜態檔案的實體目錄位置。而 static_url_path的主要目的是用來虛擬url的路徑。

比較好的寫法

實際上,使用url_for替靜態檔案建立url是比較好的習慣,如下所示:

<img src="{{ url_for('static', filename='logo.png') }}">

因此,我們可以把原來的url:

<a class="navbar-brand" href="#">    <img src='img/logo.png'> Navbar</a>

修改為下面的方式:

<a class="navbar-brand" href="#">    <img src={{ url_for('static', filename='logo.png') }}> Navbar</a>

在這種方式下,我可以自由的改變路徑,而不需要來回的在template與py檔案中修改。例如:我們把前面的虛擬路徑img改成img_abc時,我們不需要到template中修改<img>裡面的src屬性,因為我們使用url_for的方式撰寫路徑,可以讓路徑自動的取得static_url_path中的數值。

app = Flask(__name__, static_url_path='/img_abc',static_folder='views/assets/')

執行伺服器,可以看到logo的路徑已經自動變成img_abc了。

以上就是Flask對靜態檔案的處理方式。

延伸閱讀

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。