關(guān)于靜態(tài)文件的部分报腔,有興趣的可以去官網(wǎng)看看:
Django3.2 關(guān)于管理靜態(tài)文件 (不必糾結(jié)Django是哪個版本惩琉,關(guān)于靜態(tài)文件的配置的都一樣)
當(dāng)然庄撮,覺得官網(wǎng)介紹的太復(fù)雜的話壹粟,接下來可以看我寫的部分:
假設(shè)創(chuàng)建了一個名為myweb的項(xiàng)目蠢沿,那么項(xiàng)目文件目錄應(yīng)該是這樣的:
C:\Users\Administrator\Desktop>django-admin startproject myweb
C:\Users\Administrator\Desktop>cd myweb
C:\Users\Administrator\Desktop\myweb>tree /f
文件夾 PATH 列表
卷序列號為 000000C9 E6A5:0777
C:.
│ manage.py #與manage.py同級的目錄就是當(dāng)前項(xiàng)目文件夾下
│
└─myweb
settings.py
urls.py
wsgi.py
__init__.py
關(guān)于靜態(tài)文件的配置部分在settings.py文件中進(jìn)行配置苛吱,那么屹电。。吃沪。
Django有哪些關(guān)于靜態(tài)文件的配置汤善?
-
django.contrib.staticfiles
:創(chuàng)建項(xiàng)目后,默認(rèn)就有票彪,作用是用來處理靜態(tài)文件的红淡,但是只針對于debug=true,如果debug=false時降铸,就無法正常使用了(之后會講如何正確加載靜態(tài)文件)在旱。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles' #debug=true時,就由這里的配置處理靜態(tài)文件
]
2.STATIC_ROOT
:這個是配置靜態(tài)文件存放目錄推掸,另外一個作用就是運(yùn)行收集靜態(tài)文件的命令(關(guān)于命令的部分后面會講)時桶蝎,最終靜態(tài)文件收集存放的位置驻仅,注意,這個配置只會在debug=false時生效(生產(chǎn)環(huán)境)(至于為什么之后會講)登渣。
#vim settings.py ->在settings.py中配置STATIC_ROOT
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
#指定當(dāng)前項(xiàng)目目錄下的static文件夾用于存放靜態(tài)文件
# BASE_DIR指的是當(dāng)前項(xiàng)目的路徑噪服,Django會自動幫我們處理
#os.path.join()會拼接后面的路徑
-
STATIC_URL
:毫無疑問,這個是我們在編寫HTML文件時胜茧,書寫靜態(tài)文件路徑時用到的粘优,例如我們在HTML文件中如果想加載某個靜態(tài)文件時,就需要寫出該文件的路徑竹揍,有了這個配置后敬飒,我們就不需要寫靜態(tài)文件的具體路徑
#Django默認(rèn)配置
STATIC_URL = '/static/'
4.STATICFILES_DIRS
:在實(shí)際項(xiàng)目開發(fā)中邪铲,如果我們的靜態(tài)文件存放在一個或多個目錄時芬位,可以定義一個列表,用于存儲靜態(tài)文件带到,django默認(rèn)配置并沒有這個配置昧碉,如果需要,請自己定義揽惹,當(dāng)項(xiàng)目下存在一個或多個靜態(tài)資源的目錄時被饿,非常適合這樣定義。注意搪搏,這個配置只在debug=true時生效(開發(fā)環(huán)境)
#vim settings.py ->在settings.py中配置STATICFILES_DIRS
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'templates/frontweb/static'),
os.path.join(BASE_DIR, 'static'),
BASE_DIR / "static",
'/var/www/static/', #絕對路徑狭握,非相對路徑
("downloads", "/opt/webfiles/stats"), #給文件夾起別名
#以上幾種方法均可
os.path.join(BASE_DIR, '/static'),
#這種方式會找不到靜態(tài)文件,os.path.join()方法會自動拼接‘/’疯溺,因此一定要注意论颅,加了‘/’,就會出現(xiàn)找不到的情況
]
- 注:這里我們可以看到
STATIC_ROOT
和STATICFILES_DIRS
的作用實(shí)際上是類似的囱嫩,因此恃疯,這兩個配置并不需要同時定義,在開發(fā)時墨闲,我們可能會定義多個靜態(tài)資源文件夾今妄,但是最終項(xiàng)目還是要部署的,因此最后靜態(tài)資源會統(tǒng)一進(jìn)行收集鸳碧,部署時盾鳞,一般只需要定義STATIC_ROOT
這一個配置就好,并且如果同時用STATIC_ROOT
和STATICFILES_DIRS
的方式重復(fù)定義了同一個文件夾作為靜態(tài)資源存放路徑瞻离,反而會報(bào)錯腾仅,例如:
# 這里進(jìn)行了重復(fù)定義,程序會報(bào)錯
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
#會報(bào)以下錯誤:
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:
ERRORS:
?: (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.
System check identified 1 issue (0 silenced).
-
MEDIA_URL
:用法同STATIC_URL
琐脏,方便我們在編寫代碼時書寫路徑攒砖。
#vim setting.py -> MEDIA_ROOT配置
MEDIA_URL = '/media/'
-
MEDIA_ROOT
:作用同STATIC_ROOT缸兔,用于定義媒體資源存放路徑。
#vim setting.py -> MEDIA_ROOT配置
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
可能會有疑問吹艇,既然已經(jīng)有了static靜態(tài)文件配置惰蜜,為什么還要再配置media?
原因是分工不同受神,static存放的是靜態(tài)資源抛猖,而media雖然也存放相關(guān)資源,但存放的是用戶自己上傳的資源鼻听,例如頭像财著,文件等,這個時候放在static文件夾里面顯然不合適撑碴。
因此撑教,網(wǎng)站開發(fā)時所需的圖片等靜態(tài)資源是依然存放在static文件夾中,而不是media文件夾醉拓。
-
{% load static %}
:如果在HTML中使用了static方法引入的路徑伟姐,就需要在HTML中引入,否則亿卤,文件將依然無法找到愤兵,下面舉個例子,如何在HTML中正確引用靜態(tài)資源排吴。
<!DOCTYPE html>
{% load static %} #在此處引用static標(biāo)簽秆乳,
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
#假設(shè)在static文件夾下存在picture,里面有一個名為1.png的文件钻哩,這兩種方法都能成功加載出來
#css和js引用方法類似屹堰,不做演示
<img src="{% static 'picture/1.png' %}" />
<img src="/static/picture/1.png" />
#第一種就是django提供的模板語法,因此使用前需要load static一下
#第二種是通過配置的STATIC_URL找到的該文件憋槐。
#這兩種寫法的好處就是當(dāng)靜態(tài)文件目錄發(fā)生變化時双藕,不需要再到HTML中手動修改,只需修改相應(yīng)的配置即可阳仔。當(dāng)然忧陪,你也可以通過寫相對路徑的方式成功加載。
</html>
8.templates
:定義HTML模板文件存放目錄近范,如果你用的是pycharm的IDE的話嘶摊,在創(chuàng)建項(xiàng)目時,可以根據(jù)配置自動創(chuàng)建一個templates目錄评矩,pycham會自動幫我們配置叶堆,如果沒有配置,就需要手動創(chuàng)建斥杜,當(dāng)然虱颗,你也可以選擇自定義該目錄
# vim ./setting.py ->配置templates模板文件夾
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# 這里就是定義templates模板文件存放位置的配置沥匈,意思是當(dāng)前項(xiàng)目文件下的templates文件夾,前提是templates文件夾存在
# 下面部分配置省略
},
]
9.collectstatic
:在項(xiàng)目部署時忘渔,我們還要進(jìn)行靜態(tài)文件的收集高帖,如果手動收集靜態(tài)文件的話,工程量無疑很大畦粮,而且部署后散址,debug肯定要改為debug=false
,這時如果不進(jìn)行靜態(tài)文件的收集的話宣赔,django自帶的部分预麸,如admin后臺就會出現(xiàn)CSS無法加載的問題,因此儒将,項(xiàng)目部署前吏祸,這個操作是是必須的。
django的django.contrib.staticfiles
提供了一個收集靜態(tài)文件的命令:python manage.py collectstatic
椅棺,執(zhí)行該命令后犁罩,會將靜態(tài)文件收集到配置好的STATIC_ROOT
中
C:\Users\Administrator\Desktop\myweb>python manage.py collectstatic