這篇文章主要介紹了Django如何實現(xiàn)視圖,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)主要從事成都網站設計、成都做網站、外貿網站建設、網頁設計、企業(yè)做網站、公司建網站等業(yè)務。立足成都服務新樂,10多年網站建設經驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:13518219792
一個視圖函數(shù)(類),簡稱視圖,是一個簡單的Python 函數(shù)(類),它接受Web請求并且返回Web響應。
響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片。
from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "It is now %s." % now return HttpResponse(html)
首先,我們從 django.http模塊導入了HttpResponse類,以及Python的datetime庫。
接著,我們定義了current_datetime函數(shù)。它就是視圖函數(shù)。每個視圖函數(shù)都使用HttpRequest對象作為第一個參數(shù),并且通常稱之為request。
注意,視圖函數(shù)的名稱并不重要;不需要用一個統(tǒng)一的命名方式來命名,以便讓Django識別它。我們將其命名為current_datetime,是因為這個名稱能夠比較準確地反映出它實現(xiàn)的功能。
這個視圖會返回一個HttpResponse對象,其中包含生成的響應。每個視圖函數(shù)都負責返回一個HttpResponse對象。
基于函數(shù)的view,就叫FBV。還可以把view寫成基于類的,叫CBV。
# 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版添加班級 from django.views import View class AddClass(View): def get(self, request): return render(request, "add_class.html") def post(self, request): class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/")
注意:使用CBV時,urls.py中也做對應的修改:
# urls.py中 url('add_class/', views.AddClass.as_view()),
FBV本身就是一個函數(shù),所以和給普通的函數(shù)加裝飾器無差:
def wrapper(func): def inner(*args, **kwargs): start_time = time.time() ret = func(*args, **kwargs) end_time = time.time() print("used:", end_time-start_time) return ret return inner # FBV版添加班級 @wrapper 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")
類中的方法與獨立函數(shù)不完全相同,因此不能直接將函數(shù)裝飾器應用于類中的方法 ,我們需要先將其轉換為方法裝飾器。
Django中提供了method_decorator裝飾器用于將函數(shù)裝飾器轉換為方法裝飾器。
# CBV版添加班級 from django.views import View from django.utils.decorators import method_decorator class AddClass(View): @method_decorator(wrapper) def get(self, request): return render(request, "add_class.html") def post(self, request): class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/")
當一個頁面被請求時,Django就會創(chuàng)建一個包含本次請求原信息的HttpRequest對象。Django會將這個對象自動傳遞給響應的視圖函數(shù),一般視圖函數(shù)約定俗成地使用 request參數(shù)承接這個對象。官方文檔
path_info返回用戶訪問url,不包括域名
method請求中使用的HTTP方法的字符串表示,全大寫表示。
GET包含所有HTTP GET參數(shù)的類字典對象
POST包含所有HTTP POST參數(shù)的類字典對象
body請求體,byte類型 request.POST的數(shù)據就是從body里面提取到的
所有的屬性應該被認為是只讀的,除非另有說明。
屬性: django將請求報文中的請求行、頭部信息、內容主體封裝成 HttpRequest 類中的屬性。 除了特殊說明的之外,其他均為只讀的。 0.HttpRequest.scheme 表示請求方案的字符串(通常為http或https) 1.HttpRequest.body 一個字符串,代表請求報文的主體。在處理非 HTTP 形式的報文時非常有用,例如:二進制圖片、XML,Json等。 但是,如果要處理表單數(shù)據的時候,推薦還是使用 HttpRequest.POST 。 另外,我們還可以用 python 的類文件方法去操作它,詳情參考 HttpRequest.read() 。 2.HttpRequest.path 一個字符串,表示請求的路徑組件(不含域名)。 例如:"/music/bands/the_beatles/" 3.HttpRequest.method 一個字符串,表示請求使用的HTTP 方法。必須使用大寫。 例如:"GET"、"POST" 4.HttpRequest.encoding 一個字符串,表示提交的數(shù)據的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 的設置,默認為 'utf-8')。 這個屬性是可寫的,你可以修改它來修改訪問表單數(shù)據使用的編碼。 接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取數(shù)據)將使用新的 encoding 值。 如果你知道表單數(shù)據的編碼不是 DEFAULT_CHARSET ,則使用它。 5.HttpRequest.GET 一個類似于字典的對象,包含 HTTP GET 的所有參數(shù)。詳情請參考 QueryDict 對象。 6.HttpRequest.POST 一個類似于字典的對象,如果請求中包含表單數(shù)據,則將這些數(shù)據封裝成 QueryDict 對象。 POST 請求可以帶有空的 POST 字典 —— 如果通過 HTTP POST 方法發(fā)送一個表單,但是表單中沒有任何的數(shù)據,QueryDict 對象依然會被創(chuàng)建。 因此,不應該使用 if request.POST 來檢查使用的是否是POST 方法;應該使用 if request.method == "POST" 另外:如果使用 POST 上傳文件的話,文件信息將包含在 FILES 屬性中。 7.HttpRequest.COOKIES 一個標準的Python 字典,包含所有的cookie。鍵和值都為字符串。 8.HttpRequest.FILES 一個類似于字典的對象,包含所有的上傳文件信息。 FILES 中的每個鍵為 中的name,值則為對應的數(shù)據。 注意,F(xiàn)ILES 只有在請求的方法為POST 且提交的