如何管理靜態檔案(例如圖片、JavaScript、CSS)¶
網站通常需要提供額外的檔案,例如圖片、JavaScript 或 CSS。在 Django 中,我們將這些檔案稱為「靜態檔案」。Django 提供了 django.contrib.staticfiles
來幫助您管理它們。
此頁面說明如何提供這些靜態檔案。
設定靜態檔案¶
請確保
django.contrib.staticfiles
已包含在您的INSTALLED_APPS
中。在您的設定檔中,定義
STATIC_URL
,例如STATIC_URL = "static/"
在您的模板中,使用
static
模板標籤,以使用已設定的staticfiles
STORAGES
別名來建構給定相對路徑的 URL。{% load static %} <img src="{% static 'my_app/example.jpg' %}" alt="My image">
將您的靜態檔案儲存在應用程式中名為
static
的資料夾中。例如my_app/static/my_app/example.jpg
。
提供檔案
除了這些設定步驟之外,您還需要實際提供靜態檔案。
在開發期間,如果您使用 django.contrib.staticfiles
,當 DEBUG
設定為 True
時,runserver
將會自動完成(請參閱 django.contrib.staticfiles.views.serve()
)。
此方法效率極低,而且可能不安全,因此不適用於生產環境。
請參閱 如何部署靜態檔案,以了解在生產環境中提供靜態檔案的正確策略。
您的專案可能還會有不屬於特定應用程式的靜態資源。除了在您的應用程式中使用 static/
目錄之外,您還可以在設定檔中定義一個目錄列表(STATICFILES_DIRS
),Django 也會在其中尋找靜態檔案。例如
STATICFILES_DIRS = [
BASE_DIR / "static",
"/var/www/static/",
]
有關 staticfiles
如何尋找您的檔案的詳細資訊,請參閱 STATICFILES_FINDERS
設定的文件。
靜態檔案的命名空間
現在我們或許可以將靜態檔案直接放在 my_app/static/
中(而不是建立另一個 my_app
子目錄),但這實際上會是一個壞主意。Django 會使用它找到的第一個名稱符合的靜態檔案,如果您在不同的應用程式中有一個名稱相同的靜態檔案,Django 將無法區分它們。我們需要能夠讓 Django 指向正確的檔案,而確保這一點的最佳方法是命名空間它們。也就是說,將這些靜態檔案放在以應用程式本身命名的另一個目錄中。
您可以透過指定 前綴,在 STATICFILES_DIRS
中為靜態資源設定命名空間。
在開發期間提供靜態檔案¶
如果您如上所述使用 django.contrib.staticfiles
,當 DEBUG
設定為 True
時,runserver
將會自動執行此操作。如果您的 INSTALLED_APPS
中沒有 django.contrib.staticfiles
,您仍然可以使用 django.views.static.serve()
視圖來手動提供靜態檔案。
這不適合在生產環境中使用!如需一些常見的部署策略,請參閱 如何部署靜態檔案。
例如,如果您的 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)
注意
此輔助函式僅在偵錯模式下且僅在給定的前綴是本機(例如 static/
)而不是 URL(例如 http://static.example.com/
)時才有效。
此外,此輔助函式僅提供實際的 STATIC_ROOT
資料夾;它不會執行像 django.contrib.staticfiles
一樣的靜態檔案探索。
最後,靜態檔案是透過 WSGI 應用程式層的封裝器提供的。因此,靜態檔案請求不會經過正常的 中介軟體鏈。
在開發期間提供使用者上傳的檔案¶
在開發期間,您可以使用 django.views.static.serve()
視圖,從 MEDIA_ROOT
提供使用者上傳的媒體檔案。
這不適合在生產環境中使用!如需一些常見的部署策略,請參閱 如何部署靜態檔案。
例如,如果您的 MEDIA_URL
定義為 media/
,您可以透過將以下程式碼片段新增至您的 ROOT_URLCONF
來完成此操作
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)
注意
此輔助函式僅在偵錯模式下且僅在給定的前綴是本機(例如 media/
)而不是 URL(例如 http://media.example.com/
)時才有效。
測試¶
當執行使用實際 HTTP 請求而非內建測試用戶端的測試時(即,當使用內建的 LiveServerTestCase
時),需要沿著其餘內容提供靜態資源,以便測試環境盡可能忠實地重現真實環境,但是 LiveServerTestCase
僅具有非常基本的靜態檔案提供功能:它不知道 staticfiles
應用程式的尋找器功能,並假設靜態內容已收集在 STATIC_ROOT
下。
因此,staticfiles
提供了自己的 django.contrib.staticfiles.testing.StaticLiveServerTestCase
,它是內建類別的子類別,能夠在這些測試執行期間透明地提供所有資源,方式與我們在開發時使用 DEBUG = True
獲得的方式非常相似,也就是說,無需先使用 collectstatic
來收集它們。
部署¶
django.contrib.staticfiles
提供了一個方便的管理命令,用於在單一目錄中收集靜態檔案,以便您可以輕鬆地提供它們。
將
STATIC_ROOT
設定設定為您想要從中提供這些檔案的目錄,例如STATIC_ROOT = "/var/www/example.com/static/"
執行
collectstatic
管理命令$ python manage.py collectstatic
這會將您靜態資料夾中的所有檔案複製到
STATIC_ROOT
目錄。使用您選擇的網路伺服器來提供檔案。如何部署靜態檔案 涵蓋了一些常見的靜態檔案部署策略。
了解更多¶
本文檔涵蓋了基本知識和一些常見的用法模式。 有關 django.contrib.staticfiles
中包含的所有設定、命令、範本標籤和其他部分的完整詳細資訊,請參閱 staticfiles 參考。