網(wǎng)站通常需要提供類似圖片,JavaScript 或 CSS 的額外文件服務(wù)。在 Django 中,我們將這些文件稱為“靜態(tài)文件”。Django 提供了 django.contrib.staticfiles 幫你管理它們。
本頁(yè)介紹如何為這些靜態(tài)文件提供服務(wù)。
配置靜態(tài)文件
確保
INSTALLED_APPS包含了django.contrib.staticfiles。在配置文件中,定義
STATIC_URL,例子:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
- 在模板中,用
static模板標(biāo)簽基于配置STATICFILES_STORAGE位給定的相對(duì)路徑構(gòu)建 URL。
{% load static %}
<img src="{% static "my_app/example.jpg" %}" alt="My image">
- 將你的靜態(tài)文件保存至程序中名為 static 的目錄中。例如 my_app/static/my_app/example.jpg。
你的工程可能包含未與任何應(yīng)用綁定的靜態(tài)資源。除了在 apps 中使用 static/ 目錄,你可以在配置文件中定義一個(gè)目錄列表 (STATICFILES_DIRS) ,Django 會(huì)從中尋找靜態(tài)文件。例子:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
'/var/www/static/',
]
參考 STATICFILES_FINDERS 配置的文檔了解 staticfiles 是如何找到你的文件的細(xì)節(jié)。
開發(fā)時(shí)提供靜態(tài)文件服務(wù)
若你使用了前文所述的 django.contrib.staticfiles, runserver 會(huì)在 DEBUG 為 True 時(shí)自動(dòng)處理。若你未在 INSTALLED_APPS 中包含 django.contrib.staticfiles,你仍能手動(dòng)通過 django.views.static.serve() 為靜態(tài)文件提供服務(wù)。
這不適合生產(chǎn)環(huán)境!常見的部署策略請(qǐng)參考 部署靜態(tài)文件。
例如,若 STATIC_URL 為 /static/,你能通過添加以下代碼片段至 urls.py 完成目的:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
- 注解
該助手函數(shù)只能在 debug 模式下生效,且要求前綴是本地的(例如
/static/),不是一個(gè) URL (例如http://static.example.com/)。
當(dāng)然,助手函數(shù)只為實(shí)際的
STATIC_ROOT目錄提供服務(wù);它不會(huì)像django.contrib.staticfiles一樣搜索靜態(tài)文件。
開發(fā)期間保存用戶上傳的文件
開發(fā)期間,你能用 django.views.static.serve() 視圖為用戶上傳的媒體文件提供服務(wù)。
這不適合生產(chǎn)環(huán)境!常見的部署策略請(qǐng)參考 部署靜態(tài)文件。
例如,若 MEDIA_URL 定義為 /media/,你可以通過將以下代碼片段加入 urls.py 實(shí)現(xiàn)目的:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
- 注解
該助手函數(shù)只能在 debug 模式下生效,且要求前綴是本地的(例如 /static/),不是一個(gè) URL (例如 http://media.example.com/)。
測(cè)試
運(yùn)行使用真實(shí) HTTP 請(qǐng)求(而不是內(nèi)置的測(cè)試客戶端,即內(nèi)置的 LiveServerTestCase)的測(cè)試用例時(shí),靜態(tài)資源要與剩余內(nèi)容分別提供服務(wù),這樣,測(cè)試環(huán)境才能盡量重現(xiàn)真實(shí)的問題。但 LiveServerTestCase 只擁有非?;镜臑殪o態(tài)文件提供服務(wù)的能力:它并不知道 staticfiles 應(yīng)用的查找功能,且總是假設(shè)靜態(tài)內(nèi)容已被收集至 STATIC_ROOT 目錄下。
因此, staticfiles 自帶了 django.contrib.staticfiles.testing.StaticLiveServerTestCase,這是一個(gè)內(nèi)置子類,能夠透明地以類似我們?cè)陂_發(fā)階段 DEBUG = True 時(shí)獲得的方式為所有靜態(tài)資源在測(cè)試期間提供服務(wù)。即無需先用 collectstatic 收集它們。
部署
django.contrib.staticfiles 提供了一個(gè)便利的管理命令,用于將靜態(tài)文件收集至獨(dú)立目錄,方便你為它們提供服務(wù)。
- 將
STATIC_ROOT配置成你喜歡的目錄,在這個(gè)目錄提供服務(wù),例如:
STATIC_ROOT = "/var/www/example.com/static/"
- 運(yùn)行
collectstatic管理命令:
$ python manage.py collectstatic
這將會(huì)把靜態(tài)目錄下的所有文件拷貝至 STATIC_ROOT 目錄。
- 選一個(gè) Web 服務(wù)器為這些文件提供服務(wù)。 文檔 部署靜態(tài)文件 介紹了靜態(tài)文件的常見部署策略。
了解更多
本文檔已覆蓋基礎(chǔ)和常見模式。對(duì)于所有配置項(xiàng),命令,模板標(biāo)簽和其他包含在 django.contrib.staticfiles 碎片的全部細(xì)節(jié),參考 靜態(tài)文件參考。