2012年8月26日 星期日

深入了解 django 的 static 與 media

 

為什麼要設定 static?

為什麼一但設置在 apache 中,static 設定就變得格外重要?開發時,使用 runserver 都不用管這些設定也可以正常運作!

其實那是因為 runserver 是用程式動態決定檔案位置的,如此一來這些 static 檔案,便是參照各「套件」底下的 static 資料夾,而不需要另外設置

作怪的地方在下方,註解起來 runserver 就無法「使用」各套件底下的 static 了(反之應該也可以修改成在 apache 中使用各套件底下的 static,未測試過,也不推薦)

django/contrib/staticfiles/management/commands/runserver.py

image

 

但是為何不能使用 runserver 在正式環境呢?

官方也有提到

https://docs.djangoproject.com/en/dev/ref/django-admin/#runserver-port-or-address-port

DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests. (And that's how it's gonna stay. We're in the business of making Web frameworks, not Web servers, so improving this server to be able to handle a production environment is outside the scope of Django.)

 

static 的檔案,讓 django 動態處理,累積起來也是十分浪費效能的,我猜這也是原因之一

 

static 設置說明

在寫 Web 時的路徑非常重要,所以往往因為專案路徑改變而發生悲劇,在 Django 裡,你必須了解以下兩種設置有何不同。(media 觀念亦同)


STATIC_URL = "/static/"

這指的是你的 Template 在撰寫 html 時,所引用的路徑,與 Web Server (如 apache) 的指向息息相關。

所有 Django developer 在撰寫 Template 都會遵守的寫法

<script src="{{ STATIC_URL }}mezzanine/js/jquery.tools.js"></script>

or

<link rel="stylesheet"
type="text/css"
href="{% static "admin/css/login.css" %}" />


PS:兩種寫法在意義上似乎有所不同,有機會研究再發佈一篇文章

 

所以如果使用 apache,那麼上面的設置便會全部指向

[ApacheDocumentRoot]/static/

(如 C:/AppServ/www/static)

 

STATIC_ROOT = "C:/AppServ/www/static/"

這個設置是為了讓 python manage.py collectstatic 知道將 static 檔案收集在哪。

原則上必須與 STATIC_URL 指向的路徑一致,才不會導致與 Web Server 找到的檔案不同

在這個 case 中,就會等於 C:/AppServ/www/static

 

PS:在 apache 的 conf 中,也可以利用 Alias 來轉向,只要設置正確就好

 

STATIC_ROOT 更詳細的說明,可以參考

區別 Django 中的 STATIC_ROOT 與 STATICFILES_DIRS

 

說了這麼多 static,那 media 呢?

mediastatic 不同的地方在於,media 通常是用於放置使用者可新增、編輯、刪除的資料,如上傳的圖片,文件等,除此之外,其餘觀念與 static 的設置沒有什麼不同

沒有留言:

張貼留言