django中有兩種不同類型的「靜態」文件。
- 捆綁資源/資產與應用(CSS,JavaScript的典型值)
- 任何文件上傳您的用戶。
由於這些是兩個不同類別的靜態文件,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中隔離。
你會說媒體文件夾應該在公共場所嗎?爲了安全起見,我應該在一個文件夾中包含所有公共文件?就像它在Apache/PHP世界中一樣? – Matthieu