Django中settings中的四個(gè)設(shè)置參數(shù)的一些故事:
MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL
1、MEDIA_ROOT與MEDIA_URL
事實(shí)上MEDIA_ROOT和MEDIA_URL代表的是用戶上傳后的文件一般保存的地方。我的理解是,可變文件的文件夾。
與這兩個(gè)參數(shù)有聯(lián)系的,是在Django的FileField和ImageField這樣的Model類中,有upload_to參數(shù)可選。當(dāng)upload_to設(shè)置相關(guān)的地址后,如:upload_to="username";文件上傳后將自動(dòng)保存到 os.path.join(MEDIA_ROOT, upload_to)。
而MEDIA_URL,,則代表用戶通過URL來訪問這個(gè)本地地址的URL。如本機(jī)http://127.0.0.1/, MEDIA_URL設(shè)置為"/site_media/",那么通過http://127.0.0.1/site_media/*** 就可以訪問相關(guān)的上傳圖片或者其他資源。
2、STATIC_ROOT與STATIC_URL
STATIC_ROOT和STATIC_URL則是網(wǎng)站中,用于網(wǎng)站顯示的靜態(tài)圖片、CSS、JS等文件的保存地址。我的理解是,運(yùn)行中不會(huì)再變文件的文件夾(即不會(huì)刪除或者新增)
2.1 STATIC_URL
同MEDIA_URL類似;STATIC_URL為"/static/"時(shí)候,通過http://127.0.0.1/static/***就可以訪問相關(guān)的靜態(tài)文件了。
2.2 STATIC_ROOT
STATIC_ROOT是一個(gè)比較特殊的文件夾。這是區(qū)別Django的開發(fā)模式和部署模式下最大的地方了。
通常我們?cè)陂_發(fā)模式下,可以在我們所在的project下建立相應(yīng)的app, 然后每個(gè)app下都建立相應(yīng)的static文件夾。在開發(fā)模式下(Debug=True),Django將為我們自動(dòng)查找這些靜態(tài)文件(每個(gè)app)并在網(wǎng)頁上顯示出來。然而,在部署模式下,Django認(rèn)為這些工作交由web服務(wù)器來運(yùn)行會(huì)更有效率。
因此,在部署時(shí),我們需要運(yùn)行一下python manage.py collectstatic 這個(gè)命令。這個(gè)命令將會(huì)把每個(gè)app里的static目錄下的文件copy到STATIC_ROOT這個(gè)文件夾下,這時(shí)候如果在部署模式下(Debug=False),網(wǎng)頁中相關(guān)的,如: http://127.0.0.1/static/*** 的訪問,將不會(huì)訪問Django下各個(gè)App中的static,而是STATIC_ROOT中所指定的文件夾。
3、Debug=False后,為何無法訪問圖片和js等文件了?
其實(shí)這個(gè)問題,是在于web服務(wù)器沒有對(duì)STATIC_ROOT以及MEDIA_ROOT這兩個(gè)文件夾進(jìn)行映射所導(dǎo)致的。
以apache為例,假定:
STATIC_ROOT="/home/user/static/"
STATIC_URL="/static/"
MEDIA_ROOT="/home/user/media/"
MEDIA_URL="/media/"
那么可以在apache的配置文件中,增加以下:
<Location "/static/"> Order deny,allow Allow from all Satisfy Any </Location> Alias /static/ "/home/user/static" <Location "/media/"> Order deny,allow Allow from all Satisfy Any </Location> Alias /media/ "/home/user/media/"
4、開發(fā)模式中,MEDIA_ROOT和MEDIA_URL問題
在開發(fā)模式下,我們有時(shí)候會(huì)發(fā)現(xiàn)http://127.0.0.1/media/下無法訪問我們上傳的文件。在Django最新的版本中,可以在url中增加相關(guān)的映射來解決,在你的urlpatterns后面增加:
配合下面的方式使用才能訪問到文件,大家看到+static()的方式也相當(dāng)于是通過static靜態(tài)文件訪問的形式來訪問文件。那么就可以直接配置在settings中
media_root = os.path.join(settings.BASE_DIR,settings.MEDIA_ROOT) urlpatterns += static(settings.MEDIA_URL, document_root = media_root)