1. 程式人生 > >Python-Django-靜態檔案

Python-Django-靜態檔案

除了由伺服器生成的HTML檔案外,網頁應用一般需要提供其它必要的檔案 —— 比如圖片檔案、JavaScript指令碼和CSS樣式表 —— 來為使用者呈現出一個完整的網站。 在Django中,我們將這些檔案稱為“靜態檔案”。

對於小型專案,這不是個大問題,因為你可以將它們放在你的網頁伺服器可以訪問到的地方。 然而,在大一點的專案中 —— 尤其是那些由多個應用組成的專案 —— 處理每個應用提供的多個靜態檔案集合開始變得很難。

這正是django.contrib.staticfiles的用途:它收集每個應用(和任何你指定的地方)的靜態檔案到一個單獨的位置,這個位置在線上可以很容易維護。

自定義你的應用的外觀

首先在你的polls中建立一個static目錄。Django將在那裡查詢靜態檔案,這與Django在polls/templates/中尋找對應的模板檔案的方式是一致的。~~~

Django 的 STATICFILES_FINDERS 設定包含一個查詢器列表,它們知道如何從各種源找到靜態檔案。 其中預設的一個是AppDirectoriesFinder,像在剛剛polls中建立的那個專案查詢方式一樣,它會在每個INSTALLED_APPS下查詢“static”子目錄,。管理站點也為它的靜態檔案使用相同的目錄結構。

在你剛剛建立的static目錄中,建立另外一個目錄polls並在它下面建立一個檔案style.css

換句話講,你的樣式表應該位於polls/static/polls/style.css因為AppDirectoriesFinder 靜態檔案查詢器的工作方式,你可以通過polls/style.css在Django中訪問這個靜態檔案,與你如何訪問模板的路徑類似。

靜態檔案的名稱空間

與模板類似,我們可以將靜態檔案直接放在polls/static(而不是建立另外一個polls 子目錄),但實際上這是一個壞主意。Django將使用它所找到的第一個符合要求的靜態檔案的檔名,如果在你的不同應用中存在兩個同名的靜態檔案,Django將無法區分它們。我們需要告訴Django該使用其中的哪一個,最簡單的方法就是為它們新增名稱空間。 

也就是說,將這些靜態檔案放進以它們所在的應用的名字命名的另外一個目錄下。 

將下面的程式碼放入樣式表中 (polls/static/polls/style.css):

polls/static/polls/style.css
li a {
    color: green;
}

下一步,在polls/templates/polls/index.html的頂端新增如下內容 :

polls/templates/polls/index.html
{% load staticfiles %}

<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />

{% load staticfiles %} 從staticfiles模板庫載入{% static %} 模板標籤。{% static %}模板標籤會生成靜態檔案的絕對URL。

這就是你在開發過程中所需要對靜態檔案做的所有處理。 重新載入http://localhost:8000/polls/,你應該會看到Question的超連結變成了綠色(Django的風格!),這意味著你的樣式表被成功匯入。

新增一張背景圖片

下一步,我們將建立一個子目錄來存放圖片。 polls/static/polls/目錄中建立一個 images 子目錄。在這個目錄中,放入一張圖片background.gif換句話,將你的圖片放在 polls/static/polls/images/background.gif

然後,向你的樣式表新增(polls/static/polls/style.css):

polls/static/polls/style.css
body {
    background: white url("images/background.gif") no-repeat right bottom;
}

重新載入http://localhost:8000/polls/,你應該在螢幕的右下方看到載入的背景圖片。

警告:

當然,{% static %} 模板標籤在不是由 Django 生成的靜態檔案(比如樣式表)中是不可用的。你應該永遠使用相對路徑來相互連結靜態檔案,因為這樣你可以改變STATIC_URL ( static模板標籤用它來生成URLs)而不用同時修改一大堆靜態檔案的路徑。