譯者 | 晶顏
審校 | 重樓
毋庸置疑,Python是最為流行的編程語言之一,且提供了如Django和Flask等框架。其中,Django在Python開發(fā)人員群體中知名度極高,因其能夠為開發(fā)人員提供高效的開發(fā)流程和實用的設(shè)計。例如,對象關(guān)系映射工具(ORM)、路由以及模板特性等,均使開發(fā)人員的工作更加便捷。
然而,盡管Django具備這些強大功能,卻也存在諸多問題,諸如欠佳的應(yīng)用程序結(jié)構(gòu)、不合理的資源放置,以及“厚”視圖(fat view)和“薄”模型(skinny model)的邏輯編寫等。這些類型的問題不僅是Python新手開發(fā)人員面臨的挑戰(zhàn),對于經(jīng)驗豐富的Python開發(fā)人員而言,同樣難以妥善應(yīng)對。
下文將列舉開發(fā)人員在使用Django時最常犯的錯誤,并提供相應(yīng)的規(guī)避建議。
1. 經(jīng)常使用Python的全局環(huán)境來處理項目依賴項
這個錯誤通常是由不熟悉Python的“環(huán)境隔離”特性的Python新手開發(fā)人員所犯。在項目中,不能使用全局環(huán)境來管理項目依賴項,因為這會引發(fā)依賴項沖突問題。
此外,Python將無法同時使用同一依賴包的不同版本。這將是一個重大問題,因為不同項目對同一依賴包可能有不同且相互沖突的版本需求,若使用全局環(huán)境,將難以滿足這些差異化要求。
你可以通過隔離Python的環(huán)境來解決這個問題,具體方法如下:
使用虛擬環(huán)境
你可以使用名為virtualenv的模塊,它是一個用于在Python中構(gòu)建虛擬環(huán)境的工具。利用它創(chuàng)建的虛擬環(huán)境能夠與系統(tǒng)環(huán)境相互隔離。使用virtualenv將創(chuàng)建一個文件夾,其中包含Python項目使用這些包所需的所有重要可執(zhí)行文件。
Virtualenvwrapper
Virtualenvwrapper是一個全局安裝的Python包。它提供了一套完整的工具集,用于創(chuàng)建、刪除和激活虛擬環(huán)境。借助該工具,可將所有虛擬環(huán)境統(tǒng)一保存在一個文件夾中,便于集中管理和操作。
虛擬機(VM)
這是隔離環(huán)境的最佳方法之一,因為整個虛擬機專用于你的應(yīng)用程序。你可以從包括VirtualBox、Parallels和Proxmox在內(nèi)的一系列工具中進行選擇。此外,若將虛擬機與VM自動化工具Vagrant集成使用,還將實現(xiàn)更高效的環(huán)境管理,獲得超乎預(yù)期的效果。
容器
在容器自動化方面,Docker工具是不錯的選擇。Docker擁有眾多第三方工具,還具備捕獲特性,能夠幫助用戶快速重建容器。并且,當用戶熟悉Docker的運行機制后,會發(fā)現(xiàn)它提供了許多實用的鏡像,如Postgres、MongoDB、Redis、PySpark等,這些鏡像可極大地簡化項目開發(fā)和部署過程,且Docker的使用也較為容易上手。
上述這些都是你可以用來掌握項目依賴項隔離和管理的最佳方法。
2.沒有在requirements.txt文件中固定項目依賴關(guān)系
在啟動Python項目時,應(yīng)借助一個帶有requirements .txt文件的孤立環(huán)境來實現(xiàn)。當開發(fā)人員運用pip/easy_install進行軟件包安裝操作時,還需將所安裝的軟件包添加至requirements.txt文件中。如此一來,若后續(xù)在服務(wù)器上部署項目,過程將會簡便許多。
不同版本的軟件包有不同的模塊、參數(shù)和函數(shù)。即使依賴關(guān)系中的一個小變化也可能導致軟件包無法正常運行。因此,在requirements.txt文件中固定依賴項的特定版本至關(guān)重要。
此外,Python中有一個可用的pip-tools列表,借助命令行工具,你將能夠輕松地管理這些依賴項。這個工具很有用,因為它會自動生成一個requirement.txt文件,該文件有助于固定所有這些依賴項,甚至能涵蓋一個完整的依賴項樹。
另外需要注意的是,應(yīng)在文件系統(tǒng)、S3文件夾、FTP以及SFTP中留存依賴文件的副本。
3.不了解基于函數(shù)的視圖和基于類的視圖的優(yōu)點
在Django中,視圖是一個接收Web請求并返回Web響應(yīng)的Python函數(shù)或類。視圖充當數(shù)據(jù)模型(后端)和模板(前端)之間的橋梁。每當用戶訪問URL時,Django都會將該請求路由到相應(yīng)的視圖,然后視圖處理該請求并返回響應(yīng)。
Django視圖可分為兩種類型:基于函數(shù)的視圖(FBV)和基于類的視圖(CBV)。兩者的用途相同,但在實現(xiàn)方面采用不同的方法。
基于函數(shù)的視圖(FBV)
基于函數(shù)的視圖易于編寫和理解。它們是普通的Python函數(shù),接受HTTP請求并返回HTTP響應(yīng)。以下是基于函數(shù)的視圖(FBV)的好處:
- 高度靈活性:FBV賦予了Python開發(fā)人員極大的靈活性,使他們能夠利用任何Python函數(shù)作為視圖,該視圖還可以包括第三方庫和自定義函數(shù)。
- 易于理解:基于函數(shù)的視圖邏輯簡單明了。因此,對于小型項目和簡單視圖來說,FBV是一個很好的選擇。
- 上手快:由于FBV采用了開發(fā)人員更為熟悉的基于函數(shù)的語法結(jié)構(gòu),因此相較于CBV,Python開發(fā)人員在學習和應(yīng)用FBV時,能夠更加快速地掌握并投入使用 ,減少學習曲線帶來的時間損耗。
基于類的視圖(CBV)
另一方面,基于類的視圖(CBV)提供了一種更有條理、可重用的方式來定義視圖。在開發(fā)過程中,無需將視圖編寫為函數(shù)形式,而是將其定義為從Django內(nèi)置通用視圖繼承而來的Python類。這種方式具備如下突出優(yōu)點:
- 結(jié)構(gòu)化API的運用:CBV不僅充分發(fā)揮了面向?qū)ο缶幊痰膬?yōu)勢,還能夠借助結(jié)構(gòu)化API,使代碼結(jié)構(gòu)更加清晰,可讀性顯著增強,從而提升代碼的可維護性。
- 代碼可重用性高:CBV具有良好的可重用特性,通過子類化操作,開發(fā)人員能夠輕松地對其進行擴展與修改,在不同項目模塊或功能點中復(fù)用相同的視圖邏輯,提高開發(fā)效率,減少重復(fù)代碼的編寫。
- 接口一致性:為了有效管理各種不同版本的HTTP請求,CBV提供了統(tǒng)一且一致的接口。這使得在處理不同類型的請求時,開發(fā)人員能夠遵循相同的編程模式和接口規(guī)范,降低開發(fā)過程中的錯誤率。
- 模塊化特性:基于類的視圖本質(zhì)上具有模塊化的特征,這使得開發(fā)人員可以將復(fù)雜的視圖分解為更小的、獨立的可重用組件。每個組件專注于特定的功能實現(xiàn),有利于代碼的分工協(xié)作開發(fā)以及后期的維護與升級。
4.在視圖(而非模型)中編寫應(yīng)用邏輯
若在視圖中編寫邏輯,應(yīng)用程序將最終呈現(xiàn)出“厚”視圖、“薄”模型的情況。這種結(jié)構(gòu)存在一定弊端,因此避免此類錯誤,并在模型(而非視圖)中編寫應(yīng)用程序邏輯至關(guān)重要。
Django開發(fā)人員還可以進一步將邏輯分解成小方法,然后將它們寫入模型中。這將使他們能夠從多個來源(如前端UI、管理界面UI、API端點等)不同時間使用它。而且,開發(fā)人員僅需編寫幾行代碼就能實現(xiàn),從而避免了大量代碼的復(fù)制粘貼,有效提升代碼的簡潔性和可維護性。
具體來說,在向用戶發(fā)送電子郵件時,不應(yīng)在視圖中編寫相關(guān)邏輯,而要通過電子郵件功能擴展模型。這種將邏輯置于模型的做法還能使代碼更易于進行單元測試。因為Python開發(fā)人員可以在模型這一個地方對電子郵件邏輯進行測試,無需在每個控制器中重復(fù)測試相同的電子郵件邏輯,大大提高了測試效率與準確性。
所以,下次處理項目時,請務(wù)必牢記構(gòu)建“薄”視圖、“厚”模型,以此優(yōu)化代碼結(jié)構(gòu),提升開發(fā)質(zhì)量。
原文標題:Mistakes That Django Developers Make and How To Avoid Them,作者:Sukhwinder Singh