一、首先需要了解的知識(shí)點(diǎn)是:
1、出于對(duì)效率和安全的考慮,django管理靜態(tài)文件的功能僅限于在開(kāi)發(fā)階段的debug模式下使用,且需要在配置文件的INSTALLED_APPS中加入django.contrib.staticfiles(django工程創(chuàng)建后默認(rèn)已經(jīng)安裝),網(wǎng)站正式部署上線后,靜態(tài)文件是由Nginx等服務(wù)器管理。
二、接下來(lái)看下如何配置和引入靜態(tài)文件
先把工程的目錄結(jié)構(gòu)展示出來(lái),方便后文敘述
相關(guān)配置:
1、首先確保在配置文件的INSTALLED_APPS中加入了 django.contrib.staticfiles(默認(rèn)已加入)
2、在配置文件中配置STATIC_URL,如:
STATIC_URL="/st/" # STATIC_URL的作用是用于拼接靜態(tài)文件的存儲(chǔ)路徑。
3、在配置文件中配置STATICFILES_DIRS為靜態(tài)靜態(tài)文件的存儲(chǔ)路徑,比如:
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static") # 即靜態(tài)文件存放在 BASE_DIR/static 下(和manage.py同級(jí)目錄下),注意BASE_DIR指django工程的絕對(duì)路徑 ]
配置完成之后就可以在模板中導(dǎo)入靜態(tài)文件了
引入靜態(tài)文件:
1、在模板文件中導(dǎo)入static模板標(biāo)簽,即在模板文件的開(kāi)頭處寫(xiě)上:{% load static %}
說(shuō)明:static模板標(biāo)簽(即{% static "url" %}標(biāo)簽)并不是django內(nèi)置的模板標(biāo)簽,而是屬于自定義模板標(biāo)簽,所以我們不能直接使用,需要先導(dǎo)入該模板標(biāo)簽才行。
那么這個(gè)標(biāo)簽在哪里定義的呢?如果是pycharm,直接在{% load static %}中,把光標(biāo)放在static上,按ctr+b定位到定義處,如下圖:
根據(jù)注釋,我們可以看出這個(gè)模板標(biāo)簽的作用就是傳遞一個(gè)靜態(tài)文件的相對(duì)路徑(即形參path),返回該靜態(tài)文件的絕對(duì)路徑。
2、使用{% static "url.."%}標(biāo)簽引入靜態(tài)文件
第1步中我們已經(jīng)導(dǎo)入了static模板標(biāo)簽,也了解了它的作用,下面就可以使用它引入靜態(tài)文件了。先給個(gè)例子,方便解釋,比如我們需要在模板中引入/static/css/下的bootstrap.css,那么就應(yīng)該這么寫(xiě):
<link rel="stylesheet" href="{% static 'css/bootstrap.css' %}">
至于為什么路徑中的/static/沒(méi)寫(xiě)在static標(biāo)簽處,我們等下再解釋。
結(jié)合static函數(shù)的源碼(即static標(biāo)簽定義),上面link標(biāo)簽中的static模板標(biāo)簽的含義就是,把bootstrap.css的相對(duì)路徑'css/bootstrap.css'傳給了static函數(shù)的path形參,所以它應(yīng)該給我們返回一個(gè)該靜態(tài)文件的絕對(duì)路徑。由于我們?cè)谏衔呐渲弥信渲昧薙TATIC_URL="/st/",所以在瀏覽器端,查看該模板對(duì)應(yīng)的HTML源碼,可以發(fā)現(xiàn)django把上面這個(gè)標(biāo)簽渲染出來(lái)的結(jié)果是:
<link rel="stylesheet" href="/st/css/bootstrap.css">
?"/st/css/bootstrap.css"就是static標(biāo)簽返回的絕對(duì)路徑,那么為什么前面多個(gè)/st/?這是我們留下的第二個(gè)疑問(wèn),往后讀就能找到答案。
現(xiàn)在解釋上面留下的第一個(gè)疑問(wèn),為什么路徑中的/static/沒(méi)寫(xiě)在static標(biāo)簽處?這個(gè)又涉及到一個(gè)配置:
關(guān)于這個(gè)配置,不做深入探討,我們只需要簡(jiǎn)單了解他的作用即可,具體信息考參考官網(wǎng)(https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-STATICFILES_FINDERS)
官網(wǎng)給出的說(shuō)明就是,django在查找靜態(tài)文件的時(shí)候,首先會(huì)在STATICFILES_DIRS指定的路徑中尋找,找不到就會(huì)在各個(gè)app下的static文件夾下面找,由于我們?cè)谂渲梦募幸呀?jīng)指定了static文件夾,也就是說(shuō)已經(jīng)告訴了django,首先去static文件夾中找指定的靜態(tài)文件,所以上面的static標(biāo)簽就會(huì)自動(dòng)去static文件夾中去找css下的bootstrap.css這個(gè)靜態(tài)文件,所以就沒(méi)必要再把/static/寫(xiě)上了,否則就成了告訴django去static文件夾下的static/css/找bootstrap.css,這樣就會(huì)找不到了。
至此,我們已經(jīng)知道了如何引入static標(biāo)簽,以及使用static標(biāo)簽引入靜態(tài)文件,順帶也把STATICFILES_DIRS配置的作用說(shuō)明了,還有一個(gè)模糊的地方就是STATIC_URL配置是個(gè)什么鬼,為什么django會(huì)把上面static標(biāo)簽返回的絕對(duì)路徑前面加一個(gè)/st/?
要說(shuō)明STATIC_URL的作用,首先要捋一捋django處理http請(qǐng)求的過(guò)程:瀏覽器發(fā)送一個(gè)http請(qǐng)求,django的url解析器解析url,然后匹配到相應(yīng)的視圖函數(shù)處理請(qǐng)求。再看django最終把我們上面的標(biāo)簽渲染成如下:
<link rel="stylesheet" href="/st/css/bootstrap.css">
那么瀏覽器去請(qǐng)求這個(gè)靜態(tài)文件的時(shí)候,其完整請(qǐng)求路徑應(yīng)該是http://localhost:8000/st/css/bootstrap.css,django是如何解析這個(gè)請(qǐng)求路徑,然后找到相應(yīng)的靜態(tài)文件并返回的呢?
回憶一下我們開(kāi)頭講的,要在django中管理靜態(tài)文件,需要安裝django.contrib.staticfiles這個(gè)APP,所以猜測(cè),django處理這個(gè)請(qǐng)求都是在這個(gè)APP中完成的,進(jìn)入到這個(gè)APP
發(fā)現(xiàn)這個(gè)APP結(jié)構(gòu)和我們自定義的APP差不多,猜測(cè)django處理上述靜態(tài)文件路徑(解析路徑,路由到視圖函數(shù)處理請(qǐng)求等)就是在urls.py中完成的,點(diǎn)開(kāi):
看到上圖中的urlpatterns = [],是不是熟悉的感覺(jué)?
在點(diǎn)開(kāi)截圖中橢圓形框出的static函數(shù),看干了什么
看到re_path()是不是更熟悉的感覺(jué)?其實(shí)這個(gè)APP解析url和路由到指定視圖函數(shù)跟我們自定義的APP邏輯是一樣的。
很簡(jiǎn)單,就是把url中的前綴/st/提取出來(lái),作為正則表達(dá)式的匹配字符串,也就是說(shuō),瀏覽器發(fā)出的http:8000/st/css/bootstrap.css的請(qǐng)求,由于該地址前綴是/st/,所以會(huì)被這個(gè)規(guī)則匹配到,從而路由到相應(yīng)的視圖函數(shù)進(jìn)一步處理。
這樣,我們就明白了STATIC_URL配置項(xiàng)的作用了,就是使用{% static "url.." %}時(shí),把STATIC_URL配置的字符串拼接到靜態(tài)文件的路徑上作為其前綴,以便于在django.contrib.staticfiles這個(gè)APP解析出靜態(tài)文件的真正路徑,然后帶著這個(gè)真正路徑去STATICFILES_DIRS配置的路徑下找,找不到就去每個(gè)APP下的static文件夾中找。
所以說(shuō),STATIC_URL配置的字符串只是個(gè)符號(hào),你想寫(xiě)啥都行(當(dāng)然要守規(guī)矩)。
另外的注意事項(xiàng):
在我們配置的{% static 'css/bootstrap.css' %},中,如果寫(xiě)成{% static '/css/bootstrap.css' %}也就是css前面有個(gè)"/",那么django就會(huì)認(rèn)為這是一個(gè)絕對(duì)路徑,而不會(huì)把STATIC_URL配置項(xiàng)加到css前面,官網(wǎng):https://docs.djangoproject.com/en/2.2/topics/forms/media/#form-asset-paths 中的Paths in asset definitions條目文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-434302.html
?還有STATIC_ROOT配置,參見(jiàn):https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-STATICFILES_STORAGE
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-434302.html
到了這里,關(guān)于django靜態(tài)文件配置和使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!