洛陽課工場—Django開發者常犯的7種錯誤

Django是一個強大的web框架,但是它的強大也帶來了責任。在本文中,我們將討論即使是經驗豐富的Django開發人員也會犯的常見錯誤,但是大多數成功的Django項目遲早都需要處理這些錯誤。

重新發明輪子

Django有很多現成的特性,甚至還有更多的第三方包。試著在寫代碼之前“google”一下您想解決的問題——可能已經有一個功能豐富的解決方案了。

您還可以使用在線目錄“Django項目”,其中“apps”類別中(用於構建項目的小組件)有超過3200個項目。以下是來自清單前兩頁的有趣包的簡短示例:

  • Haystack:用於Django的模塊搜索
  • Django-taggit:用於Django的簡單標記
  • Django-guardian:用於Django的每個對象的權限
  • Django-activity-stream:從站點上的操作生成通用的活動流。用戶可以跟蹤任何參與者的個性化流的活動。

額外提示:我強烈推薦使用cookiecutter-django啟動一個新的Django項目。它有一個自定義的用戶模型,通過django-allauth進行註冊,通過Anymail發送電子郵件,以及許多與安全和部署相關的默認設置。

龐大的應用程序結構

Django是一個鬆散耦合的框架,它不要求您以任何特定的方式來構建web應用程序。然而,經驗豐富的Django開發人員有一種標準的做事方式。

Django web應用程序的基本單元是由一個或多個app組成的Django項目。Django app是一個自包含的包,它應該只做一件事。例如一個博客、會員app或事件日曆。

Django app可以包含Python模塊、特定於Django的模塊(視圖、URL、模型、表單等)、靜態文件、數據庫遷移、管理命令、單元測試等等。您應該使用簡單的邏輯將您的項目劃分為小型的、可重用的應用程序。

洛陽課工場—Django開發者常犯的7種錯誤

使用這樣的結構,相關的功能將更緊密地結合在一起,從而允許您和您的團隊更清楚地看到您的應用程序的全貌。最重要的是,您可以將該應用程序導出到另一個項目中並再次使用它,甚至可以將它作為一個開源模塊發佈在PyPi上。

編寫健壯的視圖和骨感的模型

Django的體系結構可以描述為一個模型-模板-視圖(MTV)或模型-視圖-模板(MVT)。

模型是大多數業務邏輯存在的地方。它被定義在models.py中,並存在於應用程序目錄中。它還包括將結果傳遞給視圖和模板層的數據庫查詢。

視圖由處理用戶交互的代碼組成,如處理用戶提交的表單和修改數據庫中的結果以適應您的模板。它被定義在views.py中。

如果您沒有在模型中編寫應用程序的邏輯並使用視圖,這意味著您在基於視圖的模型中編寫了代碼。這使得視圖“健壯”,而模型“骨感”。模型應該健壯一些,而視圖應該骨感一些。

您還應該利用自定義管理器。例如,自定義管理器可以提供with_counts()方法,該方法會返回一個所有OpinionPoll對象的列表,每個對象都有一個額外的num_responses屬性,該屬性是聚合查詢的結果。有關更多信息,請查看內置的UserManager。

每個視圖有太多的查詢或未優化的查詢

人們經常指責Django的ORM執行了太多的查詢或未優化的查詢。但是我們在其他框架的ORM中也能看到這種情況。

真正的問題是我們常常沒有意識到性能問題及其根源。一旦您發現了瓶頸所在,您就可以選擇正確的方法來解決它們。從這裡你可以做很多事情,但最有可能的是:

  • 修復普通中斷的ORM查詢(比如,預取)
  • 調整和優化ORM查詢
  • 在正確的位置添加緩存
  • 提供更多的資源

django-debug-toolbar是一個非常棒的調試工具。您可以使用它來跟蹤SQL查詢、請求、模板、緩存等等中的性能問題。這個小工具包將幫助您快速識別問題。我強烈推薦您使用它。

冗餘的模型字段

由於查詢不能使用計算列,而且添加一個實際的列只需“進行遷移”,因此,開發人員通常會以不同的方式複製表示相同數據的字段。

>>> 今日簽到口令:1bof <<<

很快,您的半數車輛都有is_motorcycle == True和wheel_count == 4字段,並且您不確定應該信任哪個字段(提示:兩者都不是)。

使用Django,您可以像這樣使用@property裝飾器來重構不一致的屬性。然而,雖然ORM允許您以屬性的形式去訪問列,但反之則不正確,因此您必須手動重構每個查詢。

沒有在模型上添加索引

即使是經驗豐富的Django開發人員也會忘記索引。請務必向您的模型添加索引!另一方面,不要對所有東西都進行索引,因為這會減慢插入、更新和刪除的速度。一般來說,您希望用於篩選或查詢的任何內容都有一個索引。分析您的查詢集以確定哪裡需要索引。

不一致的數據驗證

Django模型可以與一個或多個用於創建和更新模型實例的“表單”相關聯。表單有很多默認行為,特別是驗證,這是由模型的屬性控制的。實際上,模型的許多屬性的存在只是為了控制表單的默認行為。

許多Django開發人員忘記了模型不僅僅可以通過它的表單進行修改。他們也忘記了跟蹤約束在哪裡。非空嗎?那是模型上的。在一個字段上定義選項,顯式枚舉它可以具有什麼值?那是在表單上。唯一性嗎?在模型上。等等。

這種不一致的驗證會導致糟糕的用戶體驗:預先填充了一個對象的現有數據的表單,會由於現有數據無效而無法提交。

總結

Django旨在幫助開發人員儘可能快地構建軟件。然而,在匆忙添加新功能時,很容易會忘記一些東西或放鬆對全局的考慮。在本文中,我們討論了Django開發人員經常犯的一些常見錯誤以及避免這些錯誤的方法。

即使您是一名熟練的Django開發人員,這個清單也應該會很有用,因為像沒有在模型上添加索引或不一致的數據驗證之類的錯誤,不僅僅限於新開發人員。

如果您喜歡這篇文章,那麼您應該看看《Django作為Python開發人員web框架的優點和缺點》一文。

英文原文:https://www.softkraft.co/7-common-mistakes-that-django-developers-make/
譯者:憂鬱的紅秋褲


分享到:


相關文章: