Django框架

本文將對Django的框架做簡要介紹痹束,希望對大家學(xué)習(xí)Django痢掠,用好Django起到積極作用。
Django采用了MTV框架結(jié)構(gòu)匹厘。M指model(模型),T指Template(模板)脐区,V指View(視圖)愈诚。典型的訪問流程如下圖所示。

image.png

用戶提交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)整辩昆。
最后阅酪,感謝閱讀本文。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汁针,一起剝皮案震驚了整個濱河市术辐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌施无,老刑警劉巖辉词,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猾骡,居然都是意外死亡瑞躺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門兴想,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隘蝎,“玉大人,你說我怎么就攤上這事襟企≈雒矗” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵顽悼,是天一觀的道長曼振。 經(jīng)常有香客問我,道長蔚龙,這世上最難降的妖魔是什么冰评? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮木羹,結(jié)果婚禮上甲雅,老公的妹妹穿的比我還像新娘。我一直安慰自己坑填,他們只是感情好抛人,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脐瑰,像睡著了一般妖枚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苍在,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天绝页,我揣著相機與錄音荠商,去河邊找鬼。 笑死续誉,一個胖子當(dāng)著我的面吹牛莱没,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酷鸦,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼郊愧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了井佑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤眠寿,失蹤者是張志新(化名)和其女友劉穎躬翁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盯拱,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡盒发,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了狡逢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宁舰。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奢浑,靈堂內(nèi)的尸體忽然破棺而出蛮艰,到底是詐尸還是另有隱情,我是刑警寧澤雀彼,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布壤蚜,位于F島的核電站,受9級特大地震影響徊哑,放射性物質(zhì)發(fā)生泄漏袜刷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一莺丑、第九天 我趴在偏房一處隱蔽的房頂上張望著蟹。 院中可真熱鬧,春花似錦梢莽、人聲如沸萧豆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炕横。三九已至,卻和暖如春葡粒,著一層夾襖步出監(jiān)牢的瞬間份殿,已是汗流浹背膜钓。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卿嘲,地道東北人颂斜。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像拾枣,于是被迫代替她去往敵國和親沃疮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351