這篇文章帶給大家的內容是關於python中Django視圖(view)的詳解(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
一個視圖函數(類別),簡稱視圖,是一個簡單的Python 函數(類別)包含的是業務邏輯,它接受Web請求並且回傳Web回應。
回應可以是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或是一張圖片。
無論視圖本身包含什麼邏輯,都要回傳回應。程式碼寫在哪裡也無所謂,只要它在你目前專案目錄下面。除此之外沒有更多的要求了—可以說「沒有什麼神奇的地方」。
為了將程式碼放在某處,大家約定成俗將視圖放置在專案(project)或應用程式(app)目錄中的名為views.py的檔案中。
範例: 一個以html文檔的形式傳回目前日期和時間的檢視:
1 2 3 4 5 6 |
|
讓我們來逐行解釋下上面的程式碼:
首先,我們從django.http模組導入了HttpResponse類,以及Python的datetime函式庫。
接著,我們定義了current_datetime函數。它就是視圖函數。每個視圖函數都使用HttpRequest物件作為第一個參數,並且通常稱之為request。
注意,視圖函數的名稱並不重要;不需要用一個統一的命名方式來命名,以便讓Django識別它。我們將其命名為current_datetime,是因為這個名稱能夠比較精確地反映它所實現的功能。
這個視圖會傳回一個HttpResponse對象,其中包含產生的回應。每個視圖函數負責傳回一個HttpResponse物件。
Django使用請求和回應物件來透過系統傳遞狀態。
當瀏覽器向服務端請求一個頁面時,Django會建立一個HttpRequest對象,該物件包含關於請求的元資料。然後,Django載入對應的視圖,將這個HttpRequest物件作為第一個參數傳遞給視圖函數。
每個視圖負責傳回一個HttpResponse物件。
CBV(class based view)和FBV(function based view )
基於函數的view,叫FBV, 還可以把view寫成基於類別的.
FBV版
1 2 3 4 5 6 7 |
|
CBV版
1 2 3 4 5 6 7 8 9 |
|
注意: CBV時,urls.py中也要做相對應的修改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
透過繼承view方法,幫助完成邏輯業務中的功能(post,get,filter等八種接收方法),相較於FBV
CBV版更加簡潔,不用if判斷,更加模組化.
CBV版添加裝飾器
類別中的方法與獨立函數不完全相同,因此不能直接將函數裝飾器應用於類別中的方法,我們需要先將其轉換為方法裝飾器。
Django中提供了method_decorator裝飾器用於將函數裝飾器轉換為方法裝飾器。
方法一:
# 使用CBV時要注意,請求過來後會先執行dispatch()這個方法,如果需要批次對具體的請求處理方法,如get,post等做一些操作的時候,這裡我們可以手動改寫dispatch方法,這個dispatch方法就和在FBV上加裝飾器的效果一樣.
#方法二:
為FBV加裝飾器
request物件
當一個頁面被請求時,Django就會建立一個包含本次請求原資訊的HttpRequest物件。
Django會將這個物件自動傳遞給回應的視圖函數,一般視圖函數約定俗成地使用 request 參數承接這個物件。
請求相關的常用值
path_info 返回使用者存取url,不含網域名稱
method 請求所使用的HTTP方法的字串表示,以全大寫表示。
GET 包含所有HTTP GET參數的類別字典物件
POST 體,byte類型request.POST的資料就是從body裡面提取到的
屬性
所有的屬性應該被認為是唯讀的,除非另有說明.
屬性:
django將請求封包中的請求行、頭部資訊、內容主體封裝成 HttpRequest 類別中的屬性。
除了特殊說明的之外,其他都是唯讀的。
0.HttpRequest.scheme
表示請求方案的字串(通常為http或https)
#1、HttpRequest.body
##一個字串,代表請求報文的主體。在處理非 HTTP 形式的封包時非常有用,例如:二進位圖片、XML,Json等。但是,如果要處理表單資料的時候,建議還是使用 HttpRequest.POST 。
另外,我們也可以用 python 的類別檔案方法去操作它,詳情請參考 HttpRequest.read() 。
4、HttpRequest.encoding
一個字串,表示提交的資料的編碼方式(如果為 None 則表示使用DEFAULT_CHARSET 的設置,預設為 'utf-8')。
這個屬性是可寫的,你可以修改它來修改存取表單資料使用的編碼。
接下來對屬性的任何存取(例如從 GET 或 POST 中讀取資料)將使用新的 encoding 值。
如果你知道表單資料的編碼不是 DEFAULT_CHARSET ,則使用它。