我們知道Web開發(fā)最重要的是選擇合適的框架,一個好的框架可以極大的提高我們開發(fā)的效率,也能幫助我們的應(yīng)用能按照需求快速迭代。Web框架的數(shù)量和質(zhì)量是一個語言是否成熟的標(biāo)志之一。PHP下有Larvarel、CodeIgniter,Yii、TP等著名框架使得PHP成為最流行的Web語言之一。Ruby借助其強(qiáng)大框架Rails以RoR(Ruby on Rails)生態(tài)開辟了一番天地,很多RoR應(yīng)用以強(qiáng)大的功能和敏捷能力而聞名,比如知名Git服務(wù)器系統(tǒng)Gitlab。那么時下最流行的語言Python Web框架的情況怎么樣呢?今天蟲蟲就來給大家介紹這個。
概述Python和PHP一樣,也有著大量的Web框架,其Web框架生態(tài)圈非常廣泛和多樣化。在進(jìn)入具體主題之前,我們先介紹下Web框架。
Web框架是對常見通用功能的打包,比如Web權(quán)限認(rèn)證模塊、導(dǎo)航路由模塊、HTTP解析模塊、ORM模塊以及做擴(kuò)展使用的插件體系等,打包這些功能可以讓開發(fā)人員輕松地創(chuàng)建Web應(yīng)用程序。是一種高層次的代碼和應(yīng)用邏輯重用方法,可以極大的它減少了開發(fā)人員花在編寫代碼上的時間從而提高開發(fā)效率。通過提供現(xiàn)成的解決方案,Web應(yīng)用程序框架可以幫助開發(fā)人員短時間內(nèi)完成應(yīng)用的開發(fā)并持續(xù)的迭代。
Django說到Python的Web框架,無疑最想到的必然是Django。Django和Laravel最初都是借鑒了RoR的強(qiáng)大思想(動態(tài)、DDD、約定優(yōu)于配置、低重復(fù)、及時反饋)。Django框架使用了類MVC的MVT(模型、視圖、模板)模式,用Django ORM和數(shù)據(jù)庫聯(lián)系。
Django ORM內(nèi)置的管理面板,可以輕松實(shí)現(xiàn)數(shù)據(jù)庫內(nèi)容的管理。使用很少的配置就可能,自動生成數(shù)據(jù)庫模型。
視圖可以包括函數(shù)和類,視圖的URL路由分配在urls.py文件中完成,可以設(shè)計出完美優(yōu)雅的URL調(diào)度。
Django的模板的系統(tǒng)則相當(dāng)簡單,甚至不支持直接嵌入代碼,需要預(yù)先生成Tag、Filter才能調(diào)用。
Django支持強(qiáng)大的解決方案:
全棧模式,內(nèi)置了大量所有必須的模塊cache、session、feed、orm、geo、auth。
同時也支持"內(nèi)置電池"(batteries included)模式。
Django是典型的"大而全"的邏輯,這可以極大的方便大多數(shù)開發(fā)者。但是這就導(dǎo)致其靈活性不足。要引入其他更好的第三方優(yōu)秀組件就基本上很難,比如想要在Django里用SQLAlchemy或Mako,需要打上很多補(bǔ)丁,而且會導(dǎo)致管理面板,授權(quán),會話處理或生成表單等功能都不能使用。
當(dāng)然Django最人性化的地方是其強(qiáng)大的社區(qū)支持和詳細(xì)文檔完美的文檔Django 書。文檔在安裝后就完全嵌入系統(tǒng)的各個部分,使用非常方便,這使得其開發(fā)的入門門檻很低。
最后給一個Django網(wǎng)站模型的示例:
PyramidPyramid也是一個常用的熱門Python Web框架,它源于Pylons和repoze.bfg模塊,在吸取精華的基礎(chǔ)上使得Pyramid快速成長為了一個成熟和穩(wěn)定的框架。
雖然兩者出現(xiàn)的時間差不多(2005),Pyramid和Django的設(shè)計思想則大相徑庭。Pyramid非常靈活,很容易定制,可以非常自我的方式以創(chuàng)建特征。Pyramid不會強(qiáng)迫使用框架的習(xí)語,對于復(fù)雜或高度非標(biāo)準(zhǔn)的項(xiàng)目來說,這點(diǎn)非常有用。
雖然也內(nèi)置ORM模塊,但是更倡導(dǎo)使用成熟的SQLAlchemy ORM。你也可以按照喜好來定制,比如你可能喜歡peewee ORM,使用原始SQL查詢或與NoSQL數(shù)據(jù)庫集成。
Pyramid中所有選項(xiàng)都是開放式的,所以需要動手能力強(qiáng)一點(diǎn),可能最初學(xué)者稍有點(diǎn)門檻。
Pyramid是一個自稱"開始小,完成大,保持完備的框架。"(start small, finish big, stay finished framework.)。所以非常適合有一定經(jīng)驗(yàn)豐富的開發(fā)人員。
Pyramid一個典型的"Hello Chongchong"應(yīng)用示例:
web2pyweb2py源于一個教學(xué)范例框架,其最關(guān)心的是是易于開發(fā)和部署。
Web2py框架也源于RoR和Django思想的啟發(fā),奉行約定優(yōu)于配置的想法,web2py中有很多合理的默認(rèn)值,允許開發(fā)人員快速啟動。
Web2py框架自帶了很多模塊,比如內(nèi)置服務(wù)器,生成HTML的幫助器,表單,驗(yàn)證器等等,但是Web2py多數(shù)據(jù)庫引擎的支持很簡單。其他更多內(nèi)置的功能有:
jQuery和Ajax建站助手;
調(diào)度程序和cron;
雙因子認(rèn)證助手;
文本消息發(fā)送器;
事件工單系統(tǒng),允許自動將生產(chǎn)環(huán)境中發(fā)生的問題分配給開發(fā)人員。
Web2py也宣稱,提供全棧式解決方案,提供可能需要的一切模塊。
Web2py在線提供了大量文檔:
從零開始逐步指導(dǎo)入門,比如簡要介紹Python語言。以友好的方式展示web2py的各個功能,包括大量代碼示例和屏幕截圖等。
盡管具有一定競爭優(yōu)勢,但web2py的社區(qū)遠(yuǎn)遠(yuǎn)小于Django和Pyramid。其官方郵件列表也不大活躍。另外web2py目前還不能和Python 3不兼容。
web2py一個典型的廣告模型示例:
微框架與大而全思想相反的設(shè)計思想是,小而精致的設(shè)計,這就是微框架。微框架的好處就是沒有冗余,因而性能都很好。
FlaskFlask是除了Django外最流行的Python Web框架。Flask是一個微框架,具備了基本功能,也支持輕松的擴(kuò)展。因此,F(xiàn)lask更適合做為膠水來用,來粘合各個Web庫。
純 Flask不支持任何存儲,但是可以Flask-SQLAlchemy,F(xiàn)lask-MongoAlchemy和Flask-Redis等。類似的基本模板系統(tǒng)是Jinja2,可以使用Mako替換。
Flask框架的座右銘是輕量,"一次一滴"(one drop at a time),這也在其文檔中得到全面反映。關(guān)于如何構(gòu)建Flash應(yīng)用程序可以通過點(diǎn)點(diǎn)滴滴方式學(xué)習(xí)。閱讀幾段文檔后,就能適應(yīng)其開發(fā)任務(wù)了。
在Flash中你不需要一次就學(xué)習(xí)很多東西,尤其高級的功能,知道你真正需要的時候再學(xué)不遲,這樣可以避免無實(shí)踐的"尷學(xué)"。
Flask的最大問題是,沒有大量Flask擴(kuò)展支持和功能打包。常常遇到擴(kuò)展插件停更或者文檔過時的情況,需要花費(fèi)大量的精力處理這些情況。
Flask一個簡單示例如下:
FalconFalcon 獵鷹也是一個比較流行的微框架。其目標(biāo)是創(chuàng)建一個簡潔、輕量地Web應(yīng)用程序基礎(chǔ)。官方宣稱Falcon是一個裸殼(bare-metal),無限膨脹(bloat-free)的工具集,用于快速的構(gòu)建后端代碼和微服務(wù)。Falcon兼容Python 2和3,不用擔(dān)心Python的版本問題。
Falcon的一大優(yōu)勢在于其性能非常高,非常快。其官方網(wǎng)站基準(zhǔn)測試顯示,其比Django或Flask等具有很高的性能優(yōu)勢(27~75倍)。
Falcon缺點(diǎn)是其打包模塊有點(diǎn)太少,有路由,中間件,鉤子,除此之外就不提供其他功能了(裸殼)。額外其他功能,比如驗(yàn)證等都需要開發(fā)人員來開發(fā)擴(kuò)展。因?yàn)槠湓O(shè)計中就假設(shè)用于構(gòu)建REST API。
當(dāng)然其高性能的高度定制的特點(diǎn)確實(shí)是一個很好的賣點(diǎn)。畢竟有時候"最簡單的解決方案就是最好的方案"。
Falcon示例程序:
API StarAPI Star是一個新的Web微框架,只支持Python 3,其特性使用了Python 3.5中引入的類型提示。API Star使用內(nèi)置的類型提示實(shí)現(xiàn)以簡潔、聲明式的構(gòu)建驗(yàn)證模式表示,然后綁定這些模式來請求處理函數(shù)。
API Star還具有兼容OpenAPI 3 的自動API生成文檔功能。
API Star另一個突出的特性是依賴注入機(jī)制。這是一個更強(qiáng)大、更智能中間件的替代品。比如可以編寫一個所謂的Component,它將使用當(dāng)前經(jīng)過身份驗(yàn)證來提供給用戶視圖。在視圖級別,只需要明確聲明它將需要User實(shí)例,其他事情API Star就會在幕后自動完成。
自動依賴注入優(yōu)于常規(guī)中間件的優(yōu)點(diǎn)是組件不會有其他未使用視圖的開銷。同樣
API Star也可以以更傳統(tǒng),同步性的,兼容WSGI的方式在asyncio上運(yùn)行。
最后與API Star捆綁在一起的其他模塊都非常標(biāo)準(zhǔn):比如使用jinja2,路由和事件掛鉤進(jìn)行模板化擴(kuò)展支持。
總之API Star初生牛犢,發(fā)展可觀。截止當(dāng)前其GitHub存儲庫中有超過5271的星星。貢獻(xiàn)者已經(jīng)接近一百。PR的合并也非??欤且粋€快速增長和協(xié)作的新興框架。
基于異步和asyncio的框架Python web網(wǎng)站通常很慢,為了提高性能,異步技術(shù)就成了靈丹妙藥。Python也有很多這類的框架。
TwistedTwisted是Python中最古老,最成熟的Python異步框架。Twisted最初產(chǎn)生于2002年,其核心是一個名為reactor的事件驅(qū)動網(wǎng)絡(luò)引擎,用于調(diào)度和調(diào)用用戶定義的回調(diào)。開始的時候開發(fā)人員必須通過定義函數(shù)并在操作成功和失敗時分別傳遞它們來使用顯式回調(diào)。
后來Twisted引入了inlineCallbacks ,用于編寫異步代碼程序,這些代碼與常規(guī)同步代碼一樣簡單易讀。這個解決方案非常適合Python的語法,并且極大地影響了標(biāo)準(zhǔn)庫asyncio中的現(xiàn)代異步工具包。
Twisted框架的最大優(yōu)點(diǎn)是雖然本身只是一個捆綁很少的引擎,但支持許多其他擴(kuò)展可用于擴(kuò)展其功能,比如從低級網(wǎng)絡(luò)編程(TCP/UDP)和高級應(yīng)用程序(HTTP,IMAP,SHH等)。所以,Twisted天然適合編寫專業(yè)服務(wù),但不適合常規(guī)Web應(yīng)用程序。開發(fā)人員必須自己編寫很多東西才能實(shí)現(xiàn)Django中自帶那些功能。Twisted目前開發(fā)和維護(hù)還很活躍,正在努力遷移代碼到Python 3,其核心功能不久前被重寫,但許多第三方模塊還存在兼容性問題。
Twisted inlineCallbacks代碼示例:
SanicSanic是基于asyncio-Python的異步編程工具箱,與Python 3.4版本的標(biāo)準(zhǔn)庫捆綁在一起。Sanic的開發(fā)基于Sanic需要掌握asyncio思想,涉及協(xié)程的理論知識,并發(fā)編程以及關(guān)于應(yīng)用程序中數(shù)據(jù)流的推理。Sanic在處理長連接時特別有用,比如websocket,如果需要支持websockets或進(jìn)行大量持久的外部API調(diào)用,Sanic是個非常不錯的選擇。
Sanic的另一個用例是編寫 "glue-web App",它可以作為兩個具有不兼容API的子系統(tǒng)之間的代理。
Sanic框架非常快。其中一個依賴項(xiàng)是Uvloop,它用來替換asyncio的內(nèi)置事件循環(huán)的替代品。 Uvloop是libuv的包裝器,與Node.js相同的引擎。根據(jù)uvloop官方文檔,可以讓 asyncio的效率提高了2-4倍。
就功能方面Sanic模仿Flask,比如通過共享Blueprints的概念,微小的子應(yīng)用程序,允許開發(fā)人員在更大的應(yīng)用程序中拆分和組織其代碼。對于光光是數(shù)據(jù)增刪改查CRUD應(yīng)用,Sanic也不是一個好的選擇。
Sanic的一個示例:
Japronto在高性能編程領(lǐng)域,有著名的C10K甚至C10M問題,Python Web應(yīng)用怎么實(shí)現(xiàn)每秒處理100W的請求呢?這就是Python把a(bǔ)syncio添加到標(biāo)準(zhǔn)庫時想要實(shí)現(xiàn)的目標(biāo)。Japronto是一個基于asyncio的微框架。通過使用uvloop和PicoHTTPParser Japronto實(shí)現(xiàn)了每秒處理100萬個請求。 Uvloop上面說了是基于libuv的asyncio后端,而PicoHTTPParser是用C編寫的輕量級HTTP頭解析器。
Japronto框架的所有核心組件也用C實(shí)現(xiàn),還使用各種低層優(yōu)化和技巧來調(diào)整性??能。Japronto主要用于高性能特殊任務(wù),它們無法通過大而冗余的主流框架實(shí)現(xiàn)。
Japronto還為REST API的微服務(wù)開發(fā)提供堅(jiān)實(shí)的基礎(chǔ),開發(fā)人員只需要設(shè)置路由并確定哪些路由應(yīng)使用同步或異步處理程序。
Japronto中"Hello world"應(yīng)用示例:
aiohttpAiohttp是另一個基于asyncio的庫,與其說aiohtt是個Web框架,其更像是一個工具箱,補(bǔ)充了與HTTP相關(guān)的異步庫。aiohttp不僅有助于編寫服務(wù)應(yīng)用程序,還有助于客戶端的開發(fā)。兩者都受益于asyncio,最重要的是能夠同時處理數(shù)千個連接。
客戶端開發(fā)方面,當(dāng)需要同時發(fā)出大量請求時,使用異步的的客戶端腳本非常有用。比如寫一個爬蟲抓取網(wǎng)頁。如果沒有asyncio,就要使用線程或多進(jìn)程,這樣更加不好處理,而且需要的資源更大。
除了構(gòu)建獨(dú)立應(yīng)用程序之外,aiohttp的客戶端也可以用于任何需要非阻塞HTTP調(diào)用。也支持Websockets,通過,aiohttp可以輕松地連接到websocket服務(wù)器進(jìn)行消息交換。
在服務(wù)器端aiohttp提供了微框架所能提供的一切,包括路由,中間件和信號機(jī)制等開箱即用的功能。麻雀雖小五臟俱全,aiohttp可以滿足Web服務(wù)器的需求。
Aiohttp是在考慮測試的基礎(chǔ)上構(gòu)建的。想要測試基于aiohttp的應(yīng)用程序的開發(fā)人員會發(fā)現(xiàn)它非常容易,特別是和pytest配合使用的情況下。
aiohttp默認(rèn)就可以提供很好的性能,但還可以自主優(yōu)化,比如配合其他庫使用,比如cchardet和aiodns。Aiohttp可以自動檢測它們;也可以和uvloop配合。
aiohttp的一個明顯優(yōu)勢是有活躍的社區(qū)和積極地開發(fā)維護(hù)團(tuán)隊(duì),所以使用aiohttp作為一個開發(fā)是個很不錯的選擇。
aiohttp客戶端示例:
其他Web開發(fā)框架市面上還有很多的Python Web框架,可能大家也有自己喜歡和使用的,可以回帖共享給大家。
比如Tornado,它是一個Web server,還是一個類web.py的微框架。該框架包括支持異步的庫,可以構(gòu)建支持多個同時連接的應(yīng)用程序(如長輪詢和WebSocket等)。
比如Quixote,可能國內(nèi)的開發(fā)者都比較熟悉。因?yàn)閲鴥?nèi)知名的互動社區(qū)豆瓣網(wǎng)就是使用Quixote開發(fā)的。
總結(jié)本文蟲蟲給大家分類列舉了常用的Python Web框架,可供初學(xué)者選擇和使用。有一定經(jīng)驗(yàn)的開發(fā)者也可以作為知識開拓眼界來參考。
掃描二維碼推送至手機(jī)訪問。
版權(quán)聲明:本文由信途科技轉(zhuǎn)載于網(wǎng)絡(luò),如有侵權(quán)聯(lián)系站長刪除。
轉(zhuǎn)載請注明出處http://m.quickersubmitter.com/xintu/18750.html