Django對靜態文件的處理——開發階段

上一篇說完了 Django 爲部署階段所提供的靜態文件處理工具,這篇接着說開發階段。django

開發階段服務器

在 Django 看來,靜態文件的處理應該交由另外的程序來處理。但爲了方便快速開發,Django 也提供了一些工具,在開發階段臨時頂替來處理靜態文件。框架

一方面,Django 的官方文檔中用「quick and dirty」「grossly inefficient」「insecure」等字眼來屢次強調不要在實際生產環境中使用這套工具;另外一方面,Django 限制只有在 DEBUG 模式下這些工具才能工做。因此,當作輔助工具用就好,不要在生產環境下使用。函數

另外,與 上一篇中的那些工具同樣,這裏介紹的工具也在 staticfiles 應用下,都須要首先在 INSTALLED_APPS 中開啓 django.contrib.staticfiles 這一項。工具

分兩種狀況來講:post

  • 若是你是用 runserver 命令在本地啓動的 Django 程序,那麼這些輔助工具就已經自動開始爲你服務了。即,全部 STATIC_URL 下的請求都會自動被處理,顯示所需的靜態文件。ui

  • 若是你在本地用的別的服務器(好比 Apache)來啓動 Django 程序,那麼有如下幾種方式來開啓靜態文件處理程序。url

    • 在 URL 配置文件中添加兩行內容,以下,spa

      1
      2
      3
      4
      5
      from django.contrib.staticfiles.urls import staticfiles_urlpatterns
                                                                                                                              
      # ... the rest of your URLconf goes here ...
                                                                                                                              
      urlpatterns + = staticfiles_urlpatterns()

      它會自動將 STATIC_URL 匹配到相應的 STATICFILES_DIRS、應用目錄內的 /static 文件夾。(注意不是 STATIC_ROOT)rest

    • 上個方法只對本地靜態文件(STATIC)有效,而不會處理用戶上傳文件(MEDIA)。要讓 Django 處理除 STATIC 之外的靜態文件,稍微麻煩一點兒,

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      from django.conf import settings
                                                                                                           
      # ... the rest of your URLconf goes here ...
                                                                                                           
      if settings.DEBUG:
           urlpatterns + = patterns('',
               url(r '^media/(?P<path>.*)$' , 'django.views.static.serve' , {
                   'document_root' : settings.MEDIA_ROOT,
               }),
          )

      其實與上一個方法的區別就在於,須要分別手動指定 URL 和 本地路徑。

      有的文章的介紹中不是用 'django.views.static.serve' ,而是 'django.contrib.staticfiles.views.serve',寫法略有不一樣,但就別糾結了,二者基本上同樣。

    • 爲了讓上個寫法更簡單點兒,還有一個簡單函數 static 能夠用,

      1
      2
      3
      4
      5
      6
      from django.conf import settings
      from django.conf.urls.static import static
                                                                                                      
      urlpatterns = patterns('',
           # ... the rest of your URLconf goes here ...
      ) + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

      這樣能簡潔不少。

    最後,有兩個使用前提要注意:1)要在 DEBUG 模式下使用這些工具;2)STATIC_URL 或 MEDIA_URL 要爲本地路徑,不能爲空,也不能是完整的 URL 格式(好比 http://static.example.com/);

這些用法都沒有明顯的優劣,選一種就行了。顯然不少冗餘的功能都是歷史遺留的產物。

寫到這兒,又想起在練級裏邊提到過的東西。Django 一開始可能也沒有這麼複雜,不少功能也許很簡陋,但容易理解;隨着社區的發展,愈來愈多的東西加進來,爲了可以向後兼容,不少類似功能都保留了下來。對於早期使用者來講這個框架愈來愈好用,但對新手來講入門愈來愈難,繁多而相似的功能只能干擾視線。開源框架也是產品,你須要在新用戶和老用戶之間作好權衡。

關於 Django 中的靜態文件處理就是這些內容。

相關文章
相關標籤/搜索