Django學(xué)習(xí)筆記:應(yīng)用和分布式路由
在學(xué)習(xí)之前的內(nèi)容中,我寫了很多模板和視圖函數(shù),對(duì)應(yīng)的,也寫了不少的路由都擠在urls.py里,在views.py里對(duì)接口情況一目了然固然是好,但是對(duì)一個(gè)有不同業(yè)務(wù)的龐大項(xiàng)目來說,幾千條路由擠在一個(gè)文件里顯然是不合理的,springboot在這方面的處理是通過controller的類分流功能,實(shí)習(xí)模塊解耦,python在這方面做的更是解耦且聚合,解耦在于利用不同的應(yīng)用來拆開項(xiàng)目的不同模塊,每個(gè)應(yīng)用都有自己的模板、views.py,聚合在于通過應(yīng)用的文件夾把屬于改應(yīng)用的文件集合在一起,這在springboot中沒有體現(xiàn)出來,聚合的寫法有點(diǎn)類似springcloud的微服務(wù)中的聚合思想了。
應(yīng)用的創(chuàng)建

這里命令行的兩個(gè)指令都可以,每個(gè)應(yīng)用的migrations是與數(shù)據(jù)庫有關(guān)的,admin.py是后臺(tái)管理用的,__init__.py是每個(gè)包都會(huì)有的一個(gè)初始化文件,models.py是與數(shù)據(jù)庫相關(guān)的,tests.py是測(cè)試模塊,views.py是每個(gè)應(yīng)用自己的視圖函數(shù)文件,可見每一個(gè)app都是一個(gè)小的MTV。
分布式路由

? ?作用看起來有點(diǎn)像網(wǎng)關(guān),可以通過對(duì)路徑規(guī)則進(jìn)行約定,讓不同app的請(qǐng)求被主路由轉(zhuǎn)發(fā)到對(duì)應(yīng)的app中進(jìn)行處理,寫法如下:

include 的包在path和re_path的同級(jí)目錄下
應(yīng)用的模板
需要手動(dòng)在該應(yīng)用下創(chuàng)建templates的文件夾,作為模板,當(dāng)然要告知django我想在app下創(chuàng)建模板。需要確認(rèn)在settings.py下修改APP_DIRS的值為True

設(shè)置后,對(duì)于django而言,模板的所在路徑就是主目錄下的templates以及各個(gè)app下的templates,django對(duì)模板的匹配規(guī)則是從外到內(nèi)(優(yōu)先匹配主目錄下的templates),由上到下(按INSTALLED_APPS列表的順序)
注意,templates不要寫成template,這是與django約定的規(guī)則。
如果app下有index.html 主目錄下的templates也有index.html,如何匹配到app下的index.html呢?
方法一是可以讓app的index.html改名為appname_index.html,避免沖突
方法二是可以在app的temolates下不直接放html,而是先放一個(gè)appname的文件夾,如何所有的templates都放在名為appname的文件夾下,render的時(shí)候就傳遞'appname/index.html'.利用二級(jí)目錄避開了沖突。

我很喜歡方法二,寫起來優(yōu)雅一些。