本文將對Django的框架做簡要介紹痹束,希望對大家學(xué)習(xí)Django痢掠,用好Django起到積極作用。
Django采用了MTV框架結(jié)構(gòu)匹厘。M指model(模型),T指Template(模板)脐区,V指View(視圖)愈诚。典型的訪問流程如下圖所示。
用戶提交HTTP請求,Django的路由(urls.py)解析HTTP請求炕柔,將請求轉(zhuǎn)發(fā)給指定的View酌泰。View通過Model讀取數(shù)據(jù)或者編輯數(shù)據(jù),視圖的顯示樣式是利用Template完成的汗唱。最終將Http響應(yīng)返回給用戶宫莱。
例子1,比如當(dāng)前是一個圖書館的網(wǎng)站哩罪,我要查看所有的圖書列表授霸,發(fā)送HTTP請求如viewAll給網(wǎng)站。網(wǎng)站的urls.py根據(jù)該路由將請求轉(zhuǎn)發(fā)給相應(yīng)的View际插。View利用模型從數(shù)據(jù)庫中獲取數(shù)據(jù)碘耳,同時View利用Template將獲取到的數(shù)據(jù)以特定的模樣展示出來。最終將請求返回框弛。
題外話辛辨,我覺得這個與MVC特別類似。MVC網(wǎng)站中瑟枫,用戶發(fā)送請求斗搞,也有路由解析將請求轉(zhuǎn)發(fā)給Controller,Controller利用Model獲取數(shù)據(jù)慷妙,利用View將數(shù)據(jù)顯示僻焚。套路極其相似。為什么這里稱為MTV而不是MVC膝擂,我看不出什么太本質(zhì)的區(qū)別虑啤。很大的原因,我想架馋,是在于老外弄出一個新東西來狞山,就想著看能不能和之前的有什么不一樣,炒作一個新的概念叉寂。這樣萍启,大家能夠更自然的追捧——牛逼!總的來講屏鳍,這些架構(gòu)大同小異勘纯。只要心里清楚,面向?qū)ο笤O(shè)計中要將職責(zé)劃分清楚孕蝉,通過不同的類之間進行配合完成任務(wù)。
下面我們就著源代碼看一下Django如何具體實現(xiàn)MTV的腌逢。這段代碼來源于https://github.com/sibtc/bootstrap-forms-example降淮,建議大家將這段代碼下載到本地,與我一起查看。如果您安裝了git佳鳖,最簡單下載方式莫過于運行
git clone https://github.com/sibtc/bootstrap-forms-example.git
如果您沒裝git霍殴,也可以去那個網(wǎng)站下載zip格式的代碼。
我們順著http訪問的順序來看系吩,首先是simpleproject/urls.py
urlpatterns = [
path('', PersonListView.as_view(), name='person_list'),
path('add/', PersonCreateView.as_view(), name='person_add'),
path('<int:pk>/edit/', PersonUpdateView.as_view(), name='person_edit'),
]
這里負(fù)責(zé)解析http請求来庭。采用一個列表urlpatterns記錄所有的路由。請看其中的三個元素穿挨。三個元素均采用path生成路由規(guī)則月弛。path的第一個參數(shù)匹配的是路由的參數(shù)表。如第一個所示科盛,為空時帽衙,是默認(rèn)的路由。比如我們網(wǎng)站是www.example.com贞绵。當(dāng)我們僅在瀏覽器中輸入www.example.com時厉萝,就會觸發(fā)第一個path。www.example.com/add/會觸發(fā)第二個路由榨崩。第三個路由中有一個可變的id字符谴垫,用于匹配www.example.com/1/edit/或者www.example.com/2/edit/等等路由。path中的第二個參數(shù)就是所謂的View母蛛。待會翩剪,我們順藤摸瓜,看看PersonListView溯祸。最后一個參數(shù)是這個路由的一個名字肢专,這個在后續(xù)路由跳轉(zhuǎn)中會用到,暫且不表焦辅。
PersonListView.這個視圖的位置可以從文件頭部from people.views import PersonListView
看出博杖,是在people模塊下的views.py文件中people/views.py
。
class PersonListView(ListView):
model = Person
context_object_name = 'people'
非常簡單筷登。雖然看起來非常簡單剃根,但是實則完成了很多事情。
我認(rèn)為這是Django非常厲害的地方前方。如果我們對他所能干的事情非常了解的話狈醉,那么我們能夠write less,do more惠险。但是苗傅,我認(rèn)為這也造成了初學(xué)者對Django的學(xué)習(xí)成本的提高。如果對于python不是很了解的話班巩,要讀懂這段代碼還真是挺難的渣慕。
PersonListView繼承了ListView。ListView主要用于展示列表,比如我們剛才講的圖書列表逊桦,或者這里的人員列表眨猎。網(wǎng)站中很多地方都能夠用到列表這個視圖。
剛才我們講强经,要對django足夠了解睡陪,這其實是很難評價到底是多了解算是足夠了解。所以匿情,并不是要你在開發(fā)前完全了解Django兰迫。我覺得在你每次想開發(fā)一個功能的時候,仔細(xì)看看django有沒有內(nèi)置的码秉,足以讓你避免浪費很多時間了逮矛。所以,不需要足夠了解django也可以開始我們的開發(fā)偉業(yè)转砖。我們要在游泳中學(xué)會游泳须鼎!
言歸正傳,PersonListView到底完成了個什么府蔗?ListView又是個什么晋控?我們需要去看看文檔。根據(jù)文檔中的介紹姓赤,ListView中的model代表的是所采用的Model赡译,即前文所述的MTV中的M。我們知道M會去和數(shù)據(jù)庫打交道不铆。V的話自然是PersonListView本身蝌焚。那么T呢?通常會在View中有一個template_name
字段。在沒有提供T的情況下誓斥,ListView會自動去尋找一個名叫person_list.html的模板只洒。我們可以在templates\people\person_list.html
那里找到這個模板。
這個類里邊還有一個字段context_object_name
劳坑。這個字段又是什么意思毕谴?字面意思是上下文對象的名稱。也就是這個模型獲取到列表時的對象名稱距芬。如果不提供context_object_name
的話涝开,ListView的默認(rèn)字段時object_list
。這個會在Template渲染的時候使用框仔。如下舀武,在templates\people\person_list.html
中
{% for person in people %}
<tr>
<td><a href="{% url 'person_edit' person.pk %}">{{ person.name }}</a></td>
<td>{{ person.email }}</td>
<td>{{ person.job_title }}</td>
</tr>
{% empty %}
<tr class="table-active">
<td colspan="3">No data</td>
</tr>
{% endfor %}
模板在繪制列表視圖時,列表就是context_object_name
(這里是people)离斩。
我們看完了T和V银舱,最后剩下M衷旅。M在people\models.py
中,從頭部導(dǎo)入語句中可以推測出纵朋。
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=130)
email = models.EmailField(blank=True)
job_title = models.CharField(max_length=30, blank=True)
bio = models.TextField(blank=True)
整個模型也非常簡潔。共有四個字段茄袖。每個字段都定義了類型操软。此外,由于沒有指定primary_key宪祥。Django在數(shù)據(jù)庫中生成表單的時候聂薪,Django會自動添加一個主鍵。
id = models.AutoField(primary_key=True)
因此蝗羊,這個模型共有5個字段藏澳。這五個字段在視圖中是可以使用的。比如剛才在模板中
<td><a href="{% url 'person_edit' person.pk %}">{{ person.name }}</a></td>
<td>{{ person.email }}</td>
<td>{{ person.job_title }}</td>
請注意耀找,在生成路由的時候采用了person.pk
翔悠。這是主鍵的別稱,等同于采用person.id
野芒。
對于Django而言蓄愁,我們定義好了模型,我們就能夠自動在數(shù)據(jù)庫中創(chuàng)建對應(yīng)的表單狞悲。方法為執(zhí)行python manage.py migrate
撮抓,親自建立網(wǎng)站的時候你就會知道。這是我感覺用得非常爽的一個地方摇锋。之前用PHP的一個框架丹拯,數(shù)據(jù)庫表單和模型不一致是常有的事,調(diào)整起來非常麻煩荸恕。最開始乖酬,我們連數(shù)據(jù)庫都不需要配置,因為Django默認(rèn)采用sqllit數(shù)據(jù)庫戚炫,它就是一個文件剑刑。對于小網(wǎng)站足夠了。
對于django開發(fā)來講双肤,我認(rèn)為清楚django的mtv框架是十分重要的施掏。對mtv理解的越是深刻,就越能夠用好django茅糜。本文是在我一邊學(xué)習(xí)的過程中寫完的七芭,難免會有不當(dāng)之處。如您看出蔑赘,還望指出狸驳。此外预明,對于不理解的地方,也懇請指出耙箍。那一定是我講得不清楚撰糠,而不是您理解的問題。我會做相應(yīng)的調(diào)整辩昆。
最后阅酪,感謝閱讀本文。