Django CBV流程及源碼分析

来源:https://www.cnblogs.com/just-do/archive/2018/12/02/10051184.html
-Advertisement-
Play Games

Django 實現視圖的方法有兩種,一種是FBV(function base view)即基於函數的視圖,還一種高級的就是CBV(class base view),通過閱讀源碼你會發現它本質上還是基於FBV的。FBV的優點是用法和寫法都比較簡單適合剛開始學的同學使用,缺點就是不能用的面向對象的幾大特 ...


       Django 實現視圖的方法有兩種,一種是FBV(function base view)即基於函數的視圖,還一種高級的就是CBV(class base view),通過閱讀源碼你會發現它本質上還是基於FBV的。FBV的優點是用法和寫法都比較簡單適合剛開始學的同學使用,缺點就是不能用的面向對象的幾大特性只用函數進行封裝代碼多的時候會顯得代碼很冗餘,而CBV就很好的解決了這些問題。並且Django官方在後面的Django版本中加入了很多基於CBV的類,方便我們快速開發。我們先簡單的看下Django在中路由規則的是怎麼定義的,再粗略的看下一FBV,然後再講下我們今天的重點CBV。

  1、Django中路由規則的定義,沒有仔細讀源碼,簡單的講一下

    從這裡進入url的定義:

      

   這是源碼

      

   從源碼可以看出,我們在定義路由規則時,第一個參數應該傳入一個正則表達式,第二個參數傳入的就是view,從下麵的處理邏輯看,view的類型可以用兩種。第一種是list 或tuple但這種是用來處理include(......)導入的url的,第二種類型就是callable類型的也就是可執行的即函數所以我們在寫FBV的時候一定不要寫上帶上括弧,因為url()函數需要的是一個可執行對象。如果傳入這兩種以外的類型就會報錯。我們知道其實include導入 的其實也是一個callable類型的。所以我們可以確定view本質上傳入的是一個可執行的對象,在啟動服務時程式讀取路由將view函數載入記憶體,接受到請求的時候就會執行這view函數並且返回數據。理解這一點很重要,這個是FBV和CBV的基礎。  

  2、FBV中視圖的定義和url的寫法

   FBV(基於函數的視圖),定義一個函數根據請求方法的不同而作出相應的處理,註意重點是將對請求的處理封裝在一個函數中。看下例子

   view.py

   

   定義了一個login函數通過判斷請求的方法進行返回

   url.py

        

   將app01中的views文件導入並將login方法傳給url實現了一個FBV

   3、CBV中視圖的定義和url的寫法

   CBV(基於類的視圖),定義一個類,繼承django.views.View,將處理各種請求方式的邏輯用方法名加處理邏輯封裝在方法裡面,註意重點是將請求的處理封裝在類裡面

    eg:

           form dajngo.views import VIew

           class Cbv(View):

                  def a(self, params):
        pass

                  def b(self, params):

                        pass

      def get(self, request, *args, **kwargs):

        pass

                  def post(self, request, *args, **kwargs):

        pass

      def put(self, request, *args, **kwargs):

        pass       

   看下例子:

    view.py  視圖的定義

      

   url.py  路由的寫法

      

  4、分析3中的調用過程

在Django項目啟動時路由規則開始載入記憶體當程式讀到url(r'^cbv/', views.Cbv.as_View())時重點來了,views.Cbv是我們自己定義的一個對象當我們.as_view()的時候就執行了父類的靜態函數as_view方法(根據面向對象的特性可以知道是調用的父類的),我們可以根據在1中得出的結論.as_view()返回的一定是個可調用對象

看下源碼中as_view函數的定義:

  

可以看到,as_view方法正如我們想的那樣返回的是個可調用對象view,在路由規則載入記憶體後.as_view的到的其實是個view方法,在接受到請求是才會執行view方法,而view方法的返回值是self.dispatch(request, *args, **kwargs),是由一個實例對象調用的dispatch方法,我們怎麼這個self是誰呢?我們可以一層一層的往上拔從而確定這個實例對象是誰。

self.dispatch(request, *args, **kwargs)是由view()方法調用的,view()方法又是由as_view()方法調用的,as_view()方法又是由views.Cbv調用的,所以我們可以確定self就是Cbv的實例對象,但我們沒有定義dispatch方法所以這個dispatch方法一定在Views類中有定義。

  

這就是父類中dispatch的定義,先判斷請求是否正確,以get請求為例如果請求正確的話就就利用反射到self中去找與請求方式相對應的方法,根據我們上面的分析self就是我們定義的類Cbv,handler就是我們定義的get方法最後return 我們定義的get方法的返回值。一層一層的向上冒泡,get方法將返回值給dispatch,dispatchs再將返回值給view,到了view這層就和FBV一樣了。

 

 

 

 

    

 


     

 

 

   

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 話不多說,直接開魯 1. startsWith() 作用: 檢測字元串以什麼開頭 實例: 2. endsWith() 作用: 檢測字元串以什麼結尾 實例: 3. includes() 作用: 檢測字字元串中是否包含某個字元 實例: 4. repeat(n) 作用: 重覆 n 次 實例 5. padS ...
  • 接下去一系列關於 JavaScript 語法的文章中,將會出現很多在 Java 里出現或者沒出現過的專業術語,所以第一篇就先來羅列一下,每個術語先給一定的解釋。 有的理解不了沒關係,等這系列文章看完,再回過頭來看這一張基本也都能理解了。先羅列出來,至少有個印象,不至於到時看到一臉懵逼。 ...
  • 前言   本文主要介紹facebook推出的一個類庫immutable.js,以及如何將immutable.js集成到我們團隊現有的react+redux架構的移動端項目中。 本文較長(5000字左右),建議閱讀時間: 20 min 通過閱讀本文,你可以學習到: 什麼是immut ...
  • 動態組件中用匯流排Bus的坑 在我們的項目總難免會遇到用動態組件,這裡就拿 "vue官方的例子" 為例,我們欲在組件中添加匯流排bus(其實官方推薦的vuex更好用,但是有時候我們只需要傳一個小狀態,不需要用vuex),首先要mian.js 中創建一個匯流排Bus(當然這裡一般要把Bus封裝一下放在一個單 ...
  • 本文文字內容均選自《大話設計模式》一書。 解釋:觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。 此模式又叫發佈-訂閱模式。 舉例:火車到站與乘客下車。 主題: 觀察者1: 觀察者2: 客戶端: ...
  • 在互聯網產品上線之後,產品和運營人員需要即時瞭解產品的使用情況,有多少用戶,用戶使用了哪些功能,停留時長,使用路徑。。。等。要回答這些問題,需要有數據,不能拍腦袋想當然。數據怎麼得到呢?埋點就是採集數據的重要途徑。 數據埋點不是新名詞,在電腦網站出來之後就有統計工具,站長們很熟悉的谷歌、百度統計等工 ...
  •   信息管理類應用系統離不開關係數據存儲,目前大家基本都使用的是傳統的資料庫如MySql、Postgres等。作者從事信息化建設十多年,個人認為傳統的資料庫存在以下的問題: 擴展問題:   系統數據的不斷增長是個繞不過去的坎,傳統資料庫的存儲結構一般 ...
  • 1:第一個Python程式 Python程式有兩種編寫⽅式: 1.1. 進入cmd控制台. 輸入python進入編輯模式. 這時候我們可以直接編寫python程式 win + R 輸入cmd進入命令行,輸入python 1.2. 也可以在.py⽂件中編寫python代碼. 通過python命令來執⾏ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...