管理靜態(tài)文件(比如圖片、JavaScript、CSS)

網(wǎng)站通常需要提供類似圖片,JavaScript 或 CSS 的額外文件服務(wù)。在 Django 中,我們將這些文件稱為“靜態(tài)文件”。Django 提供了 django.contrib.staticfiles 幫你管理它們。

本頁(yè)介紹如何為這些靜態(tài)文件提供服務(wù)。

配置靜態(tài)文件

  1. 確保 INSTALLED_APPS 包含了 django.contrib.staticfiles

  2. 在配置文件中,定義 STATIC_URL,例子:

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]
  1. 在模板中,用 static 模板標(biāo)簽基于配置 STATICFILES_STORAGE 位給定的相對(duì)路徑構(gòu)建 URL。
{% load static %}
<img src="{% static "my_app/example.jpg" %}" alt="My image">
  1. 將你的靜態(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ì)在 DEBUGTrue 時(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ù)。

  1. STATIC_ROOT 配置成你喜歡的目錄,在這個(gè)目錄提供服務(wù),例如:
STATIC_ROOT = "/var/www/example.com/static/"
  1. 運(yùn)行 collectstatic 管理命令:
$ python manage.py collectstatic

這將會(huì)把靜態(tài)目錄下的所有文件拷貝至 STATIC_ROOT 目錄。

  1. 選一個(gè) Web 服務(wù)器為這些文件提供服務(wù)。 文檔 部署靜態(tài)文件 介紹了靜態(tài)文件的常見部署策略。

了解更多

本文檔已覆蓋基礎(chǔ)和常見模式。對(duì)于所有配置項(xiàng),命令,模板標(biāo)簽和其他包含在 django.contrib.staticfiles 碎片的全部細(xì)節(jié),參考 靜態(tài)文件參考。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容