Django | 靜態文件處理

jopen 8年前發布 | 15K 次閱讀 Django Web框架

Django: 1.8.7

在使用 django 開發中,不可避免的總會遇到靜態文件的處理,特別對于前端來說,頁面的調試都是依賴靜態文件(JS,CSS,Image等等), Django 在靜態文件處理這一塊做的不錯,但不是最優秀,畢竟 Django 只是一個框架而已,更多的業務需要搭配其他工具共同完成,這是后話。

1 文件分類

Django 把靜態文件分成了兩類: static 和 media ,看了 Django 的文檔之后,發現 Django 是按照是否與用戶互動來進行區分的

  • static : 應用頁面需要的(JS, CSS, Image...),這些相對來說是提供給用戶的,即這些文件(非嚴格講)沒有與用戶進行互動,開發者產生這些文件為訪問用戶服務,用戶只是單純的享受應用服務。

  • media : 用戶與應用程序進行交互的文件(用戶上傳的文件等等)

2 static 文件

Django 使用下面幾項來處理 static 文件

  • STATIC_ROOT

  • STATIC_URL

  • STATICFILES_DIRS

  • STATICFILES_STORAGE

  • STATICFILES_FINDERS

每一項的具體作用不寫了,不懂的可以去翻看官方文檔,已經非常清晰。

2.1 開發環境

2.1.1 在自定義的 STATICFILES_DIRS 尋找靜態文件

以下是我使用的方式:推薦

  • 保證 django.contrib.staticfiles 在 INSTALLED_APPS 中.

  • 在 TEMPLATES 配置中添加 django.template.context_processors.static

  • 在模板中使用 STATIC_URL 變量, eg:<img src="{{STATIC_URL}}girl.png>

2.1.2 在自定義的 STATIC_ROOT 尋找靜態文件

如果你想訪問靜態文件時,靜態文件在 STATIC_ROOT 中尋找

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)

這種方法不推薦,理由:開發過程中需要不斷的執行 ./manage.py collectstatic

2.2 生產環境

生產環境不同開發環境,生產環境下( DEBUG=False ), django.contrib.staticfiles 是不起任何作用的,也就說 django.contrib.staticfiles 只對開發環境( DEBUG=True )開啟

生產環境我們一般都是使用 web服務器 來管理靜態文件,管理方法就不寫了,不懂可以翻看文檔

2.3 CDN 服務

根據配置文件的不同( develop.py production.py ), 設置不同的 STATIC_URL , 這樣很容易結合 CDN 服務,生產環境配置 CDN ,這就扯到高并發去了

2.4 開發環境下默認靜態文件服務運行原理

這個原理很簡單,因為 django.contrib.staticfiles 在 INSTALLED_APPS 中, Django 自動加載 django.contrib.staticfiles 的 urls.py , urls.py 源代碼如下:

from django.conf import settings
from django.conf.urls.static import static
from django.contrib.staticfiles.views import serve

urlpatterns = []


def staticfiles_urlpatterns(prefix=None):
    """
    Helper function to return a URL pattern for serving static files.
    """
    if prefix is None:
        prefix = settings.STATIC_URL
    return static(prefix, view=serve)

# Only append if urlpatterns are empty
if settings.DEBUG and not urlpatterns:
    urlpatterns += staticfiles_urlpatterns()

重點是 staticfiles_urlpatterns 這個函數,自動把 settings.STATIC_URL 作為前綴,這些細節我們都不用管, Django 都幫我們搞好了

3 media 文件

media 這里不僅僅包含多媒體文件,包括用戶上傳的 文檔 ,自定義的 css 等等

Django 使用下面幾項來處理 media 文件

  • MEDIA_ROOT

  • MEDIA_URL

3.1 開發環境

以下是我使用方式

  • 在 TEMPLATES 配置中添加 django.template.context_processors.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)
  • 在模板中直接使用 MEDIA_URL 變量.

<video width="320" height="240" controls="controls">
  <source src="{{ MEDIA_URL }}movie.ogg" type="video/ogg">
  <source src="{{ MEDIA_URL }}movie.mp4" type="video/mp4">
</video>

3.2 生產環境

同 2.2

3.3 小結 media

其實嚴格來說 media 文件都是靜態文件,靜態文件的打包,版本控制等等需要借助其他工具來完成(前端工程范疇),跟 static 最大的區別是否由用戶產生,僅此而已。 Django-1.3 之前統一使用 media 進行管理,至于為了還會分出上面類型,不能預測

4 總結

隨著現代前端工程的發展, Django 處理靜態資源不能滿足我們的需要,當下還需要結合其他工具共同完成日益復雜的前端工程。

來自: http://segmentfault.com/a/1190000004232816

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!