這篇文章帶給大家的內容是關於python中Django視圖(view)的詳解(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
一個視圖函數(類別),簡稱視圖,是一個簡單的Python 函數(類別)包含的是業務邏輯,它接受Web請求並且回傳Web回應。
回應可以是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或是一張圖片。
無論視圖本身包含什麼邏輯,都要回傳回應。程式碼寫在哪裡也無所謂,只要它在你目前專案目錄下面。除此之外沒有更多的要求了—可以說「沒有什麼神奇的地方」。
為了將程式碼放在某處,大家約定成俗將視圖放置在專案(project)或應用程式(app)目錄中的名為views.py的檔案中。
範例: 一個以html文檔的形式傳回目前日期和時間的檢視:
from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
讓我們來逐行解釋下上面的程式碼:
首先,我們從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版
# FBV版添加班级 以函数的方式实现 def add_class(request): if request.method == "POST": class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/") return render(request, "add_class.html")
CBV版
# CBV版添加班级 以类的方式实现 from django.views import View class AddClass(View): # 继承View中的所有属性 def get(self, request): # 如果是get请求,就执行此段函数 return render(request, "add_class.html") def post(self, request): # 如果是post,请求就执行此段函数 class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/")
注意: CBV時,urls.py中也要做相對應的修改:
# urls.py中,要加括号 url(r'^add_class/$', views.AddClass.as_view()), # 注意: Addclass中并没有定义as_view方法,而是继承view中的方法,从而使其按照 #相应条件执行相应程序. 流程 1. AddPress.as_view() —— 》 view函数 2. 当请求到来的时候执行view函数: 1. 实例化自己写的类 —— 》self self = cls(**initkwargs) 2. self.request = request 3. 执行 self.dispatch(request, *args, **kwargs) 1. 执行父类中的dispatch方法 1. 判断请求方式是否被允许 1. 允许的情况 handler = 通过反射获取 get post 方法(指的是自己定义的类中的方法) 2. 不允许的情况 handler = 不允许的方法 3. handler(request, *args, **kwargs) 2. 返回HttpResponse对象 4. 返回HttpResponse对象 给django
透過繼承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 ,則使用它。