Django的MEDIA_ROOT和STATIC_ROOT

類型:Python,創建時間:一月 1, 2012, 7:14 p.m.

標題無“轉載”即原創文章,版權所有。轉載請註明來源:http://hgoldfish.com/blogs/article/77/。

在水木的Python版問了一下,MEDIA_ROOT主要是用來放置上傳的文件。Django的ORM有個特殊的字段叫做FileField是用來存儲文件的。不過實際上並不會把文件內容存到數據庫裏面——因爲大多數數據庫保存文件時效率低,而是保存在文件系統裏面。FileField只記錄一個路徑。FileField可以像個Python的file類型那樣讀寫。

在開發的時候MEDIA_ROOT不應該存放任何文件。它應該指向一個空的目錄。運行Django的開發服務器時,需要在urls.py裏面加入一個MEDIA_URL的映射,才能正常顯示上傳的內容:

from django.conf import settings

if settings.DEBUG:
    urlpatterns += patterns(",
            url(r"^media/(?P<path>.*)$", \
                "django.views.static.serve", \
                {"document_root": settings.MEDIA_ROOT,}),
)

當工程被佈署到Apache時也要記得給MEDIA_URL做個映射。

STATIC_ROOT是Django 1.3新增的特性。如同字面上的意思。保存在這個目錄裏面文件被當成靜態文件處理。不過,千萬不要把自己辛苦寫的JavaScript、圖片等靜態文件放到裏面去,接着看下去就知道了。與STATIC_ROOT搭配使用的還有STATIC_URLSTATICFILES_DIRS兩個變量。STATIC_URL一般用默認的/static/,用於指定的靜態目錄的URL。STATICFILES_DIRS則指定一個工程裏面哪個目錄存放了與這個工程相關的靜態文件,它是一個列表。假定在STATICFILES_DIRS有一個目錄是"/dolphin/besteam/pages/static",其中有一個文件是common.js。那麼,在瀏覽器裏面輸入http://localhost:8000/static/common.js就可以訪問這個JavaScript文件了。

更深層次的理解,這個東西其實是用來方便佈署Django App的。考慮一下我們編寫Django App的情況,經常會有一些靜態的文件(JavaScript、圖片等)。爲了方便,把這些文件放置到App下面的static目錄裏面。每個App都有自己的子目錄,所以在Django 1.3之前,佈署的時候就麻煩了。有三種選擇:

一是使用django.views.static.serve來處理文件。在App的urls.py裏面加上一條:

url(r"^(?/static/P<path>.*)$", "django.views.static.serve",\
        {"document_root" : "/path/to/project/app/static/"})

每個App都要加入這條紀錄,這樣做的話,靜態經過了Django的處理,速度太慢。

二是讓用戶手動寫Apache的映射。將/static/映射到/path/to/project/app/static。這種方法更麻煩,不僅URL不能衝突,而且破壞了App的代碼獨立原則。作爲佈署者,每個App的情況都要相當熟悉,不能遺落(可以強制每個App都使用static目錄)。

三是由佈署者將每個App內的static目錄內的文件複製到一個指定的目錄。然後重寫Apache,將/static映射到這個目錄。這個方案可以說兼有第一方案與第二方案的優點,已經接近staticfiles了。缺點是手動操作,還是太麻煩了一點。

新的Django提供了一個方法自動地將所有的靜態文件放在一起。只要在寫App的時候創建一個static子目錄專門保存靜態文件就行了。在開發階段,不必費心去做映射,不需要配置urls.py。在佈署到生產環境的時候,只需要配置Apache把/static/映射到STATIC_ROOT。然後運行manage.py collectstatic,自動地STATICFILES_DIRS列出的目錄以及各個App下的static子目錄的所有文件複製到STATIC_ROOT。因爲複製過程可能會覆蓋掉原來的文件,所以,一定不能把我們辛苦做出來靜態文件放這邊!

在開發階段,Django把/static映射到django.contrib.staticfiles這個App。staticfiles自動地從STATICFILES_DIRSSTATIC_ROOT以及各個App的static子目錄裏面搜索靜態文件。一旦佈署到開發環境上,settings.py不需要重新編寫,只要在Apache的配置文件裏面寫好映射,/static將會被Apache處理。django.contrib.staticfiles雖然仍然存在,但因爲不會接收到以/static/開始的路徑,所以將不會產生作用。不必擔心Django會使用處理速度變慢。另外,當settings.DEBUG is False的時候,staticfiles將自動關閉。

標題無“轉載”即原創文章,版權所有。轉載請註明來源:http://hgoldfish.com/blogs/article/77/。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章