簡易配置Django的Static檔案
Django 1.3以後,採用static方式處理靜態檔案,比如網站的css js images等等,而以前所謂的media改成處理網站自身以外的媒體檔案了。media和static用途上容易混淆,請移步上次講的《對Django media和static概念的理解》。
如果簡單使用static,配置起來會比media要少一步,下面會比較一下。說到static,不能不說說Django開發環境和部署環境的區別,Django配置檔案settings.py裡的DEBUG變數就是主要的區別, DEBUG=True,說明是在開發環境(除錯模式)下,DEBUG=False反之是在正式部署環境下使用。兩者有很大的區別,比如快取,出錯資訊的方式等等,還有今天說的靜態檔案的處理方式上。開發環境下靜態檔案都是通過Django自帶的web伺服器來處理的(這樣會更方面)。如果把DEBUG設定成False,那麼Django自帶的web伺服器自然不處理靜態檔案了,靜態檔案都交給nginx,apache來處理吧(這樣會更高效)。
具體說說static在開發環境下怎麼配置吧。
這次主要拿Django 1.4版本來做配置,這個要事先宣告,因為1.4以後,Django的專案結構發生很大的變化,如果下面的配置做法放到Django 1.3上肯定不適應了,值得注意哦。staitc的配置只要在settings.py裡做即可。
DEBUG=True
這個設定環境是處在開發環境下。
然後自己建立一個變數SITE_ROOT,變數不是必須的,只是為了方面重用,名字可以隨意起。
import os
SITE_ROOT=os.path.join(os.path.abspath(os.path.dirname(__file__)),'..')
變數值專案的根目錄,也就是settings.py的存放位置。
然後給靜態檔案變數賦值,告訴Django,靜態檔案在哪裡
STATIC_ROOT = os.path.join(SITE_ROOT,'static')
說到這裡,我還是說說專案檔案結構吧,這個容易蒙人,比如這次的講的專案結構如下:
myproject
----myproject
--------__init__.py
--------settings.py
--------urls.py
--------wsgi.py
----blog
--------__init__.py
--------models.py
--------views.py
--------test.py
----static
--------css
------------style.css
--------js
------------jquery.js
--------images
------------me.jpg
----media
--------upload
注意專案的結構,你會發現SITE_ROOT就是
myproject
----myproject
的路徑。
STATIC_ROOT就是
myproject
----media
的路徑。
好,接著配置說
STATIC_URL = '/static/'
給靜態檔案url一個字尾,在templates裡用到的。
最後關鍵的部分是STATICFILES_DIRS以下配置
STATICFILES_DIRS = (
("css", os.path.join(STATIC_ROOT,'css')),
("js", os.path.join(STATIC_ROOT,'js')),
("images", os.path.join(STATIC_ROOT,'images')),
)
簡要說一下,static資料夾在專案裡,有css js images 三個資料夾(看專案結構),他們的路徑分別是:
os.path.join(STATIC_ROOT,'css'),os.path.join(STATIC_ROOT,'js'),os.path.join(STATIC_ROOT,'images');
我們分別給他們起三個別名css,js,images(你可以隨意給,不過為了易記,我們原名稱指定別名了)
到這裡staitc算是配置完成了,並不需要再urls.py裡配置相關的東西,Django就會自動找到對的路徑解析靜態檔案了,也是在配置上static比media少了一步。
配置好了,在templates 就能正常使用靜態檔案了。怎麼用?拿一個templates講解吧。
<!DOCTYPE html><html lang="zh-CN">
<head>
<meta charset=utf-8>
<title>staitc例子</title>
<link rel="stylesheet" type="text/css" href="{{STATIC_URL}}css/style.css" media="screen" />
<script type="text/javascript" src="{{STATIC_URL}}js/jquery.js"></script>
</head>
<body>
<img src="{{STATIC_URL}}images/me.jpg"" alt="img">
</body>
</html>
注意{{STATIC_URL}}就是取配置檔案settings.py裡的STATIC_URL變數,解析出來的就是:/static/。
而{{STATIC_URL}}css/style.css最終解析出來的就是我們想要的:/static/css/style.css,Django會根據配置檔案找到相應的檔案。
快到尾聲的時候,講講正式部署環境怎麼設定吧:
DEBUG=False
首先把DEBUG設定為False,告訴Django環境是正式的非除錯模式下了,然後Django就不再通過自己來處理靜態頁面了,最後靜態檔案都交給Nginx Apache來處理了。
說說Nginx怎麼配置,才能正確解析靜態檔案吧,在一個server裡新增一個location靜態檔案處理
location /static/ {root /home/www-data/twogoo/myproject/;
}
這個也有一個容易犯錯的地方,就是路徑,有的同學常常指定這樣的路徑:/home/www-data/twogoo/myproject/staitc/;這樣Nginx應該找不到靜態檔案的,因為Nginx會跑到/home/www-data/twogoo/myproject/staitc/staitc/路徑裡找,注意這點,靜態檔案處理上你會順很多。