裏面涉及幾個個參數:
(1)第一個參數
STATIC_URL = '/static/'
配置了該參數,那麼在app路徑下的static/my_app/img/myexample.jpg這個路徑的 文件可以這樣在模板中使用。{% load staticfiles %}
<img src="{% static "my_app/img/myexample.jpg" %}" alt="My image"/>
這個路徑既然是在app路徑下的,那麼app自包含的靜態文件應該放在這裏。形成了 自包含的一個app,這樣可以隨時把這個app複製到別的項目 中使用。(2)那麼如果有些靜態文件不屬於app,而是屬於項目的,或者操作系統其他絕對路徑 的怎麼辦。
看第二個參數
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
'/var/www/static/',
)
這樣在模板中是不用變更的,仍然是上面那樣的寫法,只不過查找路徑增加了兩 個,可以查找項目下的static路徑。
(3)接下來那麼如果我要把項目上線了,部署在http服務器中,但是每個app中都有靜態文 件,每個project中都有靜態文件,路徑太多,怎麼辦?
看第三個參數STATIC_ROOT = "/var/www/example.com/static/"
在定義完該參數後,我們可以運行python manage.py collectstatic命令,它將會自動把上面配置的靜態路徑下的所有文件複製到STATIC_ROOT 路徑中。這樣就可以統一在http服務器中配置靜態文件。
(4)注意:
(a)如果我們在多個app下使用這樣的路徑static/imgs/xxx.png,那 麼我們在collectstatic後,相同 名字的會覆蓋,導致問題。所以我們一般在app下的static下加上app的namespace,形成static/myapp_name /imgs/xxx.png這 樣的結構,即使多個app的靜態文件複製到同一個文件夾下,也 沒有問題。
(b)配置完static後,配置contrib.staticfiles
在settings.py文件中找到INSTALLED_APPS,確保其中包含有’django.contrib.staticfiles',一般該配置以默認加入了,如果你開發的時候使用的是runserver方式啓動服務器,那麼你就完成了所有配置,如果你使用其他服務器來開發,則還需要在項目的urls.py中加上如下配置:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# ... the rest of your URLconf goes here ...
urlpatterns += staticfiles_urlpatterns()
需要注意的是,上面代碼的第一行必須放在整個urls文件的第一行,上面代碼的最後一行必須放在urls文件的最後一行。
那麼在開發中,我們關注的:
1、如果僅需要在app中添加靜態文件,STATIC_URL就可以滿足我們。
2、如果需要在項目目錄下,或者別的系統目錄下添加靜態文件,那麼 STATICFILES_DIRS就可以滿足我們
3、如果我們要把項目上線,那麼我們需要配置STATIC_ROOT並且collectstatic, 這樣可以在http服務器中統一配置靜態文 件路徑,方便做7層負載均衡,或者cdn 等加速靜態文件加載的高級功能。