Python Django Web典型子產品
開發實戰
點選檢視第二章 點選檢視第三章
寇雪松 編著
第1章 從新浪微網誌聊起多端應用
當人們聽到“新浪”,腦海裡第一個浮現的關聯詞是“新浪微網誌”,而不是“新浪部落格”的時候,網際網路已經發展到了多端應用的時代。如果一個網際網路公司的業務資料,還隻能通過PC端通路,那麼可以絲毫不危言聳聽地說,這家網際網路公司不論經營的業務是什麼,都很難在這個時代有所建樹。
同樣地,假如時至今日,一個網際網路開發者隻會用Django開發PC端的Web項目,還以Python全棧工程師自居的話,相信他去哪家公司面試,都會被當成入職以後需要再教育訓練很久,才能進入工作的“小白”,一旦在老闆心中被貼上“小白”的标簽,再怎麼樂觀,也需要半年的時間來撕掉吧?
其實“小白”跟“老鳥”相差的,不就是“老鳥”比“小白”多了解了一些知識點嗎?隻不過這些知識點是實際項目中必然會用到,而學校和教育訓練班卻很少提及的。一般的程式員,隻能在年複一年的工作經驗中獲得這些知識點。幸運的是,本書裡滿滿的都是這樣的知識點,從本章開始,向一隻“老鳥”蛻變吧。
1.1 AOP面對切面程式設計思想
這一節,我們來介紹多端應用的基礎程式設計思想。站在一個項目架構者的角度,對項目的宏觀布局做到胸有成竹是一項必備技能。其實多端應用的概念剛開始火起來的時候,Python全棧開發還方興未艾(至少不像近些年這麼熱),當時PHP正如日中天,AOP就被廣泛應用。想要與資深的Web開發人員侃侃而談,那麼AOP是一個絕佳的談資。
AOP(Aspect Oriented Programming,面向切面程式設計),如果要長篇大論地介紹其最早是怎麼來的,是通過多少複雜的機制實作的,那将是晦澀難懂的原理,下面舉一個例子來跟大家解釋什麼是AOP。
假如文軒和阿福家裡各有一棵蘋果樹,今天市場上蘋果很暢銷,文軒和阿福都很開心,因為他們可以摘蘋果去賣錢。但是第二天市場上桃子變得暢銷了,蘋果滞銷了,文軒不開心了,因為他隻有一顆蘋果樹,他的蘋果樹隻能結蘋果,長不出桃子來。
但是阿福依然很開心,因為他在他的蘋果樹上嫁接了一根桃枝,當天就長出了很多桃子,又賣了很多錢。第三天市場上橘子變得暢銷了,文軒依然不開心,因為他隻有蘋果;阿福依然很開心,因為他在蘋果樹上又嫁接了一根橘子枝。第四天阿福在蘋果樹上嫁接了一根梨枝,第五天嫁接了一根西瓜枝,第六天嫁接了一根巧克力枝……阿福的做法就是AOP,阿福的蘋果樹就是一個基于面對切面程式設計思想架構的Web。
AOP在軟體架構中的應用非常廣泛,是一種如果使用AOP架構最好,如果不使用AOP也行,至多就是耦合度高點兒的應用。但是在Web項目開發中,特别是進入移動網際網路時代以來,基于AOP思想,對項目進行前後端分離的基本架構,已經成為了一種必須要做的事情。2012年以前,新浪的CTO如果跟CEO說:“新浪微網誌隻能從PC端通路。”那麼并沒有什麼問題,但是,如果今天,新浪的CTO跟CEO說:“新浪微網誌隻能從PC端通路。”,那還不如直接說“世界那麼大,我想去看看。”顯得更文藝一點。
2017年12月,胡潤研究院釋出了《2017胡潤大中華區獨角獸指數》,榜單上的所有“獨角獸”公司,都可以通過PC端和移動端進行業務通路,這個結果其實是可預料的。是的,現在多端應用可以說是絕大部分公司的業務标配,身為一個程式員,必須要有一棵能長巧克力的蘋果樹。
1.2 Django的前後端分離
相信對Django有所了解的讀者都知道,Django的普通項目是基于MVT模式(Model View Template)開發的,而Django的前後端分離項目則是基于MVVM模式(Model View ViewModel)開發的,解耦得更徹底,徹底到前後端分離了,甚至可以說分離成了兩個項目。
Django前後端分離項目原理:後端遵循restful規範開發API,與前端進行資料互動,實作多端應用。
1.2.1 什麼是API
API作為一個網際網路行業的術語,很少被直接翻譯過來,因為在中文中并沒有一個對應的詞彙可以完全表達其含義,如果強行翻譯,可以被翻譯為資料接口,但顯然這個翻譯并不準确。舉個現實中的例子,比如購房網上面有全國房屋買賣的交易資料,萬達公司在需要一些房屋交易資料來作為參考投産項目時,如果自己去做社會調研,費時、費力,非常不合算,是以萬達公司每年都要向購房網支付數百萬元來購買這些交易資料。大家是否考慮過,這一筆交易是以怎樣的方式進行的呢?
所謂的一手交錢一手交貨,交錢的流程比較簡單,隻要萬達公司将資金彙給購房網就可以了,但是購房網是怎樣将全國房屋買賣的交易資料交給萬達公司呢?難道是直接将資料庫複制給萬達公司一份嗎?這顯然不可能。購房網是将一些API和權限交給萬達公司的技術人員,萬達公司的技術人員就可以通過調用這些API擷取到他們所需要的交易資料。當然,API是一個廣義的概念,除了可以通過調用API擷取到資料資源外,還可以通過API提供和擷取技術服務,在無數的SDK(軟體開發包)中都有所展現。在本章中,我們主要是通過API擷取資料。
在業内編寫這類API,不論是使用什麼程式設計語言,都需要遵循RESTful規範,當然這是衆所周知的事情。
1.2.2 RESTful規範——如何寫API
API接口應該如何寫?API跟URL有什麼不同?這絕對是不可以被忽略的問題,如果API寫得亂七八糟,很有可能會失去負責前端開發的同僚的信任。将API寫得“高大上”,也是一名開發者工匠精神的一種展現。下面來介紹如何寫API。
(1)如果是對同一個表進行資料操作(增、删、改、查),應該使用一條API,然後根據method的不同,進行不同的操作。
GET/POST/PUT/DELETE/PATCH
(2)面向資源程式設計,通過API送出的參數最好是名詞,比如name,盡量少用動詞。
http://www.abc.com/name
(3)展現版本,在API中加入像v1、v2這樣的版本代号:
http://www.abc.com/v1/name
http://www.abc.com/v2/name
(4)展現API,讓使用者一眼能看出這是API而不是URL,應該在API中加入提示:
http://www.abc.com/api/v1/name
http://www.abc.com/api/v2/name
(5)使用HTTPS,這一項原本是為了安全考慮,但是随着國内外網際網路環境對安全性越來越重視,谷歌浏覽器對所有不是HTTPS請求的連結全都會提示使用者此連結為不安全連結,騰訊等平台也對小程式等産品強制要求使用HTTPS協定。不過,好在國内許多提供雲服務的公司,像騰訊雲、阿裡雲等,都提供免費的SSL證書,供開發者去申請。
https://www.abc.com/api/v1/name
https://www.abc.com/api/v2/name
(6)響應式設定狀态碼,例如,200和201代表操作成功,403代表權限不夠,404代表沒有指定資源,500代表運作時發現代碼邏輯錯誤等。
return HttpResponse('adgbag',status=300)
(7)API的參數中加入篩選條件參數,也可以了解為擷取資源優先選擇GET的方式。
https://www.abc.com/api/v2/name?page=1&size=10
(8)傳回值的規範,不同的method操作成功後,後端應該響應的傳回值如下:
https://www.abc.com/api/v1/name
不同的送出方式代表對資料進行不同的操作:
- GET:所有清單。
- POST:新增的資料。
https://www.abc.com/api/v1/name/1
- GET:單條資料。
- PUT:更新,傳回更新的資料。
- PATCH:局部更新,傳回更新的資料。
- DELETE:删除,傳回空文檔。
(9)傳回錯誤資訊,應該加入錯誤代号code,讓使用者能直接看出是哪種類型的錯誤。
ret {
code:1000,
data:{
{'id':1,'title':'lala'}
}
}
(10)傳回的詳細資訊,應該以字典的形式放在data中。
ret {
code:1000,
data:{
{'id':1,'title':'lala','detail':http://www.……}
}
}
RESTful規範是業内約定俗成的規範,并不是技術上定義的公式,在實際生産使用中,大家還是要根據業務靈活運用。
1.2.3 Django REST framework簡介
在Python的Web業内廣為流傳一句話 “使用Python進行Web全棧開發者必會Django,使用Django開發前後端分離項目者必會Django REST framework”。使用Python進行Web全棧開發的架構,主流的就有4個,但是大家除了使用Django以外,其他的都很少使用。Django本身也擁有一些子產品,可以用于完成前後端分離項目的需求,但是大家除了使用Django REST framework以外,也很少使用其他子產品。
是以但願讀者在讀到此處之前,沒有浪費更多的時間去學習那些很少會被用到的知識。Django REST framework之是以能夠擁有如此超然的地位,源于其将Python語言特有的一些優勢發揮得淋漓盡緻,雖然其中也有可以再完善的空間,但可以毫不誇張地說,如果可以将Django REST framework的10個常用元件融會貫通,那麼使用Django開發前後端分離的項目中有可能遇到的絕大部分需求,都能得到高效的解決。
Django REST framework的10個常用元件如下:
- 權限元件;
- 認證元件;
- 通路頻率限制元件;
- 序列化元件;
- 路由元件;
- 視圖元件;
- 分頁元件;
- 解析器元件;
- 渲染器元件;
- 版本元件。
Django REST framework官方文檔的位址是
https://www.django-rest-framework.org/。
建立一個Django項目,命名為book,作為貫穿本書的示範項目。選擇PyCharm作為開發工具,在建立目錄時,建立App命名為users。