2012-11-25 47 views
1

從Apache/PHP的世界即將有件事我無法弄清楚尋找Django開發最佳實踐:(!或連渣播放)Django的文件夾結構問題

隨着Symfony2的框架,你總是有一個「公共「文件夾和網絡服務器僅從該文件夾提供文件。明顯的安全策略策略在開發過程中將公共文件放入此文件夾中也很明顯。

在django中根本看不清楚:從我的閱讀中看,在根級別上有一個靜態文件夾PLUS用於UGC文件和à模板文件夾的媒體文件夾是一種很好的做法。沒有主要的「公共」文件夾。

有人能幫我清理一下嗎?讓一個文件夾包含所有請求並保護應用程序的其餘部分會更安全嗎?

坦克

回答

3

django中有兩種不同類型的「靜態」文件。

  1. 捆綁資源/資產與應用(CSS,JavaScript的典型值)
  2. 任何文件上傳您的用戶。

由於這些是兩個不同類別的靜態文件,django提供了兩種處理它們的機制。由於第一種情況比第二種情況更常見(您可能沒有需要用戶上傳文件的應用程序),因此使用django構建處理第一種情況的方法。

根據標準佈局,需要靜態文件的應用程序將把它們包含在應用程序目錄中名爲static的目錄中。 Django將在靜態文件的INSTALLED_APPS的任何應用程序內搜索此目錄。如果您的文件與任何應用程序無關,您可以將它們放在單獨的目錄中。這個目錄應該被添加到STATICFILES_DIRS(一個元組),所以django知道它。

一旦你做到了這一點,該collectstatic命令將收集所有的靜態文件(從在INSTALLED_APPS和所有的應用程序在任何STATICFILES_DIRS目錄下的子目錄static),並把它們放到一個目錄指向STATIC_ROOT;這是如此{{ STATIC_URL }}標籤在模板中正常工作。

現在,你所做的只是移動/點/鏈接STATIC_ROOT目錄,以便它可以從網頁訪問。 Django預計STATIC_ROOT中的所有文件都可以通過STATIC_URL指定的根URL訪問。


對於用戶上傳的文件,django比較省心。所有它真正關心的是,不要將用戶上傳的文件放在與collectstatic命令將用於讀取其文件相同的位置 - 這意味着MEDIA_ROOT不能是STATICFILE_DIRS的目錄或子目錄(如果您有在這裏指定任何目錄,通常這個設置在vanilla django設置中是未定義的)。

MEDIA_ROOT是一個django可以通過在根目錄下創建子目錄來操作的目錄(例如參見FileField documentation)。

MEDIA_URL是指向用戶上傳文件的根目錄的URL前綴。這使得爲​​模型生成自動URL的命令可以正常工作。


由於這些是兩個不同類別的靜態文件,因此存在兩種不同類型的安全和部署要求。例如,您可能希望將用戶上傳的文件存儲在S3存儲桶中,但將應用程序的資產存放在其他位置。

這就是爲什麼這兩個類似的東西在django中隔離。

0

您可以將所有靜態資源複製到一個公用/靜態文件夾用命令

> python manage.py collectstatic 

提供您已在manage.py

STATIC_ROOT設置一個靜態路徑= 「〜/ mypath/public/static /」

每個應用程序都應該有自己的靜態資產。

+0

你會說媒體文件夾應該在公共場所嗎?爲了安全起見,我應該在一個文件夾中包含所有公共文件?就像它在Apache/PHP世界中一樣? – Matthieu