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