Django管理靜態文件

網站一般須要其它文件,例如:圖片、JavaScript 或者CSS。在Django 中,咱們將這類文件統稱爲「靜態文件」。Django 提供django.contrib.staticfiles 來幫助管理它們。django

本頁面描述如何提供這些靜態文件。安全

配置靜態文件

  1. 確認django.contrib.staticfiles 包含在你的INSTALLED_APPS 中。app

  2. 在你的settings 文件中定義STATIC_URL,例如:函數

    STATIC_URL = '/static/'
  3. 在模板中,你能夠硬編碼/static/my_app/myexample.jpg 這樣的URL,或者使用static 模板標籤以及配置的STATICFILES_STORAGE爲給出的相對路徑建立URL(這使得換成CDN 來保存靜態文件更加容易)。網站

    {% load staticfiles %}
    <img src="{% static "my_app/myexample.jpg" %}" alt="My image"/>
  4. 在你的應用中,將靜態文件存儲在名爲static 目錄下。例如:my_app/static/my_app/myimage.jpg。編碼

啓用靜態文件服務url

除了這些配置步驟以外,實際中你還須要啓用靜態文件服務。spa

在開發過程當中,若是你使用django.contrib.staticfiles,當DEBUG 設置成True 時,runserver 會自動啓用靜態文件服務(參見django.contrib.staticfiles.views.serve())。.net

這個方法很是低效並且可能不安全,因此它不適合線上環境debug

關於線上環境保存靜態文件的策略,參見部署靜態文件

你的項目可能還有一些靜態文件不屬於任何一個特定的應用。除了在應用中使用static/ 目錄,你還能夠在settings 文件中定義一個目錄列表(STATICFILES_DIRS),Django 會在其中查找靜態文件。例如:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
    '/var/www/static/',
)

staticfiles 如何查找靜態文件的細節,請參見STATICFILES_FINDERS 設置的文檔。

靜態文件的命名空間

如今,咱們雖然可以將靜態文件直接放在my_app/static/之下(而不用建立另一個my_app 子目錄),可是這是一個壞主意。Django 將使用它找到的名稱匹配第一個靜態文件, 若是你在另一個不一樣 的應用中有相同名稱的靜態文件,Django 將沒法區分它們。咱們須要讓Django 可以找到正確的靜態文件,最簡單的方法是給它們加上命名空間。方法是將這些靜態文件放在與應用同名的另一個目錄中。

開發過程當中啓用靜態文件服務

如上所述,若是你啓用django.contrib.staticfiles,當DEBUG 設置爲True 時,runserver 將自動啓用靜態文件服務。若是django.contrib.staticfiles 不在INSTALLED_APPS 中,你仍然可使用django.contrib.staticfiles.views.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)

這個輔助函數只在debug 模式下工做,並且給定的前綴必須是本地的(例如,/static/)而不能是一個URL(例如,http://static.example.com/)。

另外這個輔助函數只查找STATIC_ROOT 目錄下的文件;它不會像django.contrib.staticfiles 那樣查找靜態文件。

保存開發過程當中由用戶上傳的文件

在開發過程當中,你可使用django.contrib.staticfiles.views.serve() 視圖,處理用戶上傳的來自於MEDIA_ROOT的media文件。

注意:該方式不適合在線上環境中使用! 關於一些常見的部署策略,請參閱部署靜態文件一節.

例如,若是將MEDIA_URL設置爲/media/, 可將下列代碼片斷添加到urls.py中實現:

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)

注意:

該輔助函數僅在debug模式下工做,並且僅當給定的前綴是本地目錄 (例如 /media/)而不能是一個URL (例如http://media.example.com/)..

相關文章
相關標籤/搜索