Django對靜態文件的處理——部署階段

Django 的官方文檔中說,Django 主要關注的是 Web App 的動態部分,像圖片、CSS、JS 等的靜態文件都應該交由專門的服務器來處理。html

但在開發階段,本地不必定能模擬生產環境,這時也是要使用靜態文件的。爲此 Django 提供了一些工具來處理靜態文件,做爲開發階段的臨時解決方案。python

因此就分 開發階段 和 部署階段 兩種狀況來講 Django 的靜態文件處理。nginx

部署階段django

這個比較簡單,由於 Django 將這部分的工做徹底拋給服務器(好比 Nginx)了:在 HTML 中指定 URL,同時將要用到的靜態文件都放在一個地方,而後告訴服務器當對這些 URL 發起請求時到這個地方去尋找。api

Django 在這個階段的工做中只是提供了幾個輔助工具。服務器

  • django.contrib.staticfiles,用來將該 Django 項目用到的全部靜態文件統一收集到一個單獨的文件夾中,這樣在服務器配置中指向這個文件夾便可。主要操做以下:工具

    • 到 settings.py 中設置 STATICFILES_DIRS(能夠不設置),告訴 staticfiles 去哪兒找靜態文件。同時,staticfiles 默認都會蒐集每一個應用目錄下的 static/ 文件夾。url

    • 到 settings.py 中設置 STATIC_ROOT ,告訴 staticfiles 將全部的靜態文件收集到哪裏。
      spa

    • 確保 INSTALLED_APPS 中有 django.contrib.staticfiles 這項。code

    • 運行以下命令後,全部的靜態文件就會被拷貝到 STATIC_ROOT 目錄下。

      1
      . /manage .py collectstatic

    固然了,你徹底能夠不用管這些,手動將你要用到的靜態文件收集到一塊兒,若是你的項目很小的話。staticfiles 只是一個可選工具,其自己也是在 1.3 以後才引入 Django 中,它的前身是 Django 的第三方工具包 django-staticfiles

  • static 模板標籤,用來生成靜態文件的 URL 地址。這樣當負責靜態文件的服務器發生變更的時候,就不用一個個地改模板了。有如下幾種方式:

    • 直接在模板中使用 STATIC_URL 變量,好比

      1
      < img src = "{{ STATIC_URL }}images/hi.jpg" />

      固然這個變量不是憑空來的,它是 django.core.context_processors.static 提供的,默認已經在 TEMPLATE_CONTEXT_PROCESSORS 中開啓了。由於用到了 context_processor,因此你須要在渲染模板的時候使用RequestContext ,若是你用的是 render_to_response,那麼就是:

      1
      2
      return render_to_response( "some.html" , {},
               context_instance = RequestContext(request))
    • 若是嫌 RequestContext 麻煩,你可使用 get_static_prefix 這個內置的模板標籤,效果是同樣的:

      1
      2
      {% load static %}
      < img src = "{% get_static_prefix %}images/hi.jpg" />
    • 你也能夠用另一個內置模板標籤 static,一樣不須要 RequestContext:

      1
      2
      {% load static %}
      < img src = "{% static " images/hi.jpg" %}" />

      它實際上調用的是 Python 內置模塊中的 urlparse.urljoin(),將 STATIC_URL 和 後面的 path 拼接到了一塊兒。

    • 還有一個同名但更強大的 static 模板標籤,存在於以前提到過的 staticfiles 組件中,用法相似:

      1
      2
      {% load staticfiles %}
      < img src = "{% static " images/hi.jpg" %}" />

      注意 load 的對象不一樣。這個 static 的強大之處在於,即便你更換了靜態文件的存儲方式(好比使用了 CDN 或者某種雲服務),仍然不用修改模板。你只須要更改 STATICFILES_STORAGE 中使用的存儲引擎便可,經過修改存儲引擎中的對應方法來改變 static 標籤的行爲。

    這幾個方法看起來讓人眼花繚亂,實際使用中不用糾結這麼多,Django官方建議直接使用 staticfiles 中的 static,以方便之後的擴展。而前三種方法,大概能夠看作歷史遺留產物了吧。

這就是 Django 爲部署階段提供的兩方面幫助:收集靜態文件,生成靜態資源的 URL。

下面來總結下上面提到過的 settings.py 中的設置項:

  • STATIC_ROOT:執行 ./manage.py collectstatic 後,全部靜態文件就會被收集到這個文件夾下;

  • STATIC_URL:靜態文件的 URL 前綴,供相似 static,get_static_prefix 等模板標籤使用;

  • STATICFILES_DIRS:除 每一個應用目錄下的 static/ 目錄外,其餘靜態文件可能存放的目錄;

  • STATICFILES_FINDERS:告訴 collectstatic 命令都須要去哪兒找靜態文件,以及尋找的順序,有點兒相似 TEMPLATE_LOADERS;

  • STATICFILES_STORAGE:collectstatic 命令所使用的存儲引擎,默認狀況下不用修改,使用內置的 StaticFilesStorage 便可。若是要使用 CDN 或雲服務來提供靜態資源,能夠編寫相應的存儲引擎並替換便可。

  • INSTALLED_APPS:要使用上面這些功能,就要在這裏開啓 django.contrib.staticfiles 這個應用;另外,只有在這裏出現的應用纔會被 collectstatic 蒐集到。

還有兩個相關的設置項:

  • MEDIA_ROOT:用來存放用戶上傳文件的目錄。

  • MEDIA_URL:用戶上傳文件的 URL 前綴。

在以前版本的 Django 中,不區分 MEDIA_ROOT 和 STATIC_ROOT,顯然不太合適。分開以後,你能夠將 MEDIA_ROOT 中的文件像其餘靜態文件同樣,交給專門的服務器處理,或者使用 CDN 和雲服務資源。staticfiles 這個工具並不干涉 MEDIA_ROOT 中的文件。用戶上傳文件在 Django 看來屬於 Stored Files,區別於 Static Files 來看待,這就是另一個話題了。

相關文章
相關標籤/搜索