上一篇說完了 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 中的靜態文件處理就是這些內容。