一巫糙、概要
視圖可以一個python函數(shù),可以叫視圖函數(shù)颊乘,或者簡稱視圖参淹,也可以是是一個類,定義在views.py 文件中乏悄。
主要用于接收并處理請求浙值,調(diào)用模型層和模板層,響應(yīng)請求(返回HttpResponse或其子類)每一個用戶請求纲爸,都對應(yīng)著一個視圖(和url地址)亥鸠,由視圖處理請求后,再返回html頁面內(nèi)容給瀏覽器顯示识啦。在http請求中產(chǎn)生兩個核心對象,所在位置是神妹,django.http
二颓哮、核心對象
- http請求:HttpRequest對象
- http響應(yīng):HttpResponse對象
三、HttpRequest對象
1鸵荠、說明
當(dāng)請求一個頁面時冕茅,Django 創(chuàng)建一個 HttpRequest對象包含原數(shù)據(jù)的請求。然后 Django 加載適當(dāng)?shù)囊晥D蛹找,通過 HttpRequest作為視圖函數(shù)的第一個參數(shù)姨伤。每個視圖負責(zé)返回一個HttpResponse目標(biāo)
2、屬性
2.1庸疾、GET
- 說明
一個類似于字典的對象乍楚,如果請求中包含表單數(shù)據(jù),則將這些數(shù)據(jù)封裝成 QueryDict 對象 - 舉個栗子
value = request.GET.get('key',default=None)
2.2届慈、POST
- 說明
一個類似于字典的對象徒溪,如果請求中包含表單數(shù)據(jù)忿偷,則將這些數(shù)據(jù)封裝成 QueryDict 對象。 - 栗子
value = request.POST.get('key',default=None)
2.3臊泌、path
- 說明
請求頁面的全路徑鲤桥,不包括域名和參數(shù) - 栗子
/index/ /shop/list/
2.4、method
- 說明
請求中使用的HTTP方法的字符串表示渠概。全大寫表示 - 示例
if request.method=='GET': #這里是get請求 elif request.method ='POST': #這里是post請求
2.5茶凳、COOKIES
- 說明
包含所有cookies的標(biāo)準Python字典對象;keys和values都是字符串播揪。 - 示例代碼
查看會話機制專題
2.6贮喧、session
- 說明
唯一可讀寫的屬性,代表當(dāng)前會話的字典對象剪芍;自己有激活Django中的session支持時該屬性才可用塞淹。 - 栗子
查看會話機制專題
2.7、FILES
- 說明
包含所有上傳文件的類字典對象罪裹;
FILES中的每一個Key都是'<input type="file" name="" />'標(biāo)簽中 name屬性的值饱普,F(xiàn)ILES中的每一個value同時也是一個標(biāo)準的python字典對象
注意,F(xiàn)ILES 只有在請求的方法為POST 且提交的<form>
帶有enctype="multipart/form-data"
的情況下才會包含數(shù)據(jù)状共。否則套耕,F(xiàn)ILES 將為一個空的類似于字典的對象 - 栗子
查看文件上傳相關(guān)
2.8、user
- 說明
一個AUTH_USER_MODEL
類型的對象峡继,表示當(dāng)前登錄的用戶冯袍。
如果用戶當(dāng)前沒有登錄,user
將設(shè)置為django.contrib.auth.models.AnonymousUser
的一個實例碾牌。你可以通過is_authenticated()
- 栗子
具體查看用戶認證 if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users.
2.9康愤、encoding
- 說明
一個字符串,表示提交的數(shù)據(jù)的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 的設(shè)置舶吗,默認為 'utf-8')征冷。這個屬性是可寫的,你可以修改它來修改訪問表單數(shù)據(jù)使用的編碼誓琼。
接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取數(shù)據(jù))將使用新的 encoding 值检激。
如果你知道表單數(shù)據(jù)的編碼不是 DEFAULT_CHARSET ,則使用它腹侣。
2.10叔收、META
- 說明
一個標(biāo)準的Python字典包含所有可用的HTTP頭“亮ィ可用標(biāo)題取決于客戶端和服務(wù)器
- 栗子
- CONTENT_LENGTH
請求體的長度(一個字符串)饺律。 - CONTENT_TYPE
請求體的類型。 - HTTP_ACCEPT
為響應(yīng)–可以接受的內(nèi)容類型伦籍。 - HTTP_ACCEPT_ENCODING
接受編碼的響應(yīng) - HTTP_ACCEPT_LANGUAGE
接受語言的反應(yīng) - HTTP_HOST
客戶端發(fā)送的HTTP主機頭蓝晒。 - HTTP_REFERER
參考頁面 - HTTP_USER_AGENT
客戶端的用戶代理字符串腮出。 - QUERY_STRING
查詢字符串,作為一個單一的(分析的)字符串芝薇。 - REMOTE_ADDR
客戶端的IP地址 - REMOTE_HOST
客戶端的主機名 - REMOTE_USER
用戶通過Web服務(wù)器的身份驗證 - REQUEST_METHOD
字符串胚嘲,如"GET"或"POST" - SERVER_NAME
服務(wù)器的主機名 - SERVER_PORT
服務(wù)器的端口(一個字符串)
- CONTENT_LENGTH
3、方法
3.1洛二、get_host()
- 說明
根據(jù)從HTTP_X_FORWARDED_HOST(如果打開 USE_X_FORWARDED_HOST馋劈,默認為False)和 HTTP_HOST 頭部信息返回請求的原始主機。
注意:當(dāng)主機位于多個代理后面時晾嘶,get_host() 方法將會失敗妓雾。除非使用中間件重寫代理的首部。 - 栗子
# 假如要訪問的地址是 http://127.0.0.1:8000/user/login/
3.2垒迂、get_full_path()
- 說明
返回 path械姻,如果可以將加上查詢字符串。 - 舉個栗子
# 完整的請求地址 http://127.0.0.1:8000/user/list/?page=1&size=10 print(request.get_full_path()) # 輸出 /user/list/?page=1&size=10
3.3机断、is_secure()
- 說明
如果請求時是安全的楷拳,則返回True;即請求通是過 HTTPS 發(fā)起的吏奸。
3.4欢揖、is_ajax()
- 說明
判斷是否是ajax請求
四、HttpResponse對象
1奋蔚、說明
對于HttpRequest對象來說她混,是由django自動創(chuàng)建的,但是泊碑,HttpResponse對象就必須我們自己創(chuàng)建坤按。每個view請求處理方法必須返回一個HttpResponse對象
2、主要的屬性
- content:表示返回的內(nèi)容馒过,字符串類型
- charset:表示response采用的編碼字符集晋涣,字符串類型
- status_code:響應(yīng)的HTTP響應(yīng)狀態(tài)碼,默認是200
- content-type:指定輸出的MIME類型
3沉桌、主要的方法
- init
使用頁內(nèi)容實例化HttpResponse對象 - write(content)
以文件的方式寫 - flush():
以文件的方式輸出緩存區(qū) - set_cookie
設(shè)置Cookie,具體的使用看會話章節(jié)
4算吩、HttpResponse的常見的子類
4.1留凭、JsonResponse
- 說明
這個類是HttpRespon的子類,返回json類型的數(shù)據(jù)偎巢,它的默認Content-Type 被設(shè)置為: application/json - 構(gòu)造方法
JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)
- 參數(shù)說明
- data
一個字典類型的數(shù)據(jù) - encoder
json生成器 - safe
默認的safe 參數(shù)是 True. 如果你傳入的data數(shù)據(jù)類型不是字典類型蔼夜,那么它就會拋出 TypeError的異常,如果設(shè)置為False ,那data可以填入任何能被轉(zhuǎn)換為JSON格式的對象压昼,比如list, tuple, set求冷。 - json_dumps_params
一個字典,它將調(diào)用json.dumps()方法并將字典中的參數(shù)傳入給該方法
- data
- 示例代碼
# 使用HttpResponse def index(request): data={ 'name':'hello', 'age':18, } return HttpResponse(json.dumps(data),content_type="application/json") # 使用JsonResponse 直接將字典傳遞過去 def index(request): data={ 'name':'hello', 'age':18, } return JsonResponse(data)
# 如果返回的是 list類型 def index(request): data=[1,2,3,4,5] return JsonResponse(data,safe=False) ''' 注意: 如果不設(shè)置safe=False 將會拋出 TypeError錯誤 '''
4.2瘤运、TemplateResponse
- 說明
是SimpleTemplateResponse
的子類,而SimpleTemplateResponse又繼承自HttpResponse
主要的作用是將模板渲染成HTML字符串返回給客服端,具體看快捷方法中的render函數(shù)
4.3匠题、HttpResponseRedirect
- 說明
重定向拯坟,服務(wù)器端跳轉(zhuǎn)
具體看細節(jié)看重定向章節(jié)
五、快捷方法
1韭山、說明
- 頁面渲染:render(推薦)郁季,render_to_response,
- 頁面跳轉(zhuǎn):redirect
- locals: 可以直接將對應(yīng)視圖函數(shù)中所有的變量傳給模板
2、render
- 方法
render(request, template_name, context=None, content_type=None, status=None,using=None)
- 參數(shù)說明
- request
請求 - template_name(必選)
一個模板的使用或模板序列名稱全稱钱磅。如果序列是給定的梦裂,存在于第一個模板將被使用 - context(可選)
一組字典的值添加到模板中。默認情況下盖淡,這是一個空的字典年柠。 - content_type(可選)
MIME類型用于生成文檔。 - status (可選)
為響應(yīng)狀態(tài)代碼褪迟。默認值為200 -
using
用于加載模板使用的模板引擎的NAME冗恨。
- request
- 示例代碼
# 純靜態(tài)界面渲染 def index(request): return render(request,'index.html') #向用戶顯示一個html頁面
# 配合傳遞數(shù)據(jù)配合模板語法使用 def index(request): data={'user':{'name':'小明',age:18}} return render(request,'index.html',context=data) #向用戶顯示一個html頁面
# 也可以使用簡寫方式 locals()函數(shù),他會將視圖函數(shù)中的所有局部變量封裝到字典中 # 主要在開發(fā)中盡量不要使用,尤其數(shù)據(jù)比較復(fù)雜的時候,因為有可能有的數(shù)據(jù)不一定會使用 # 所以當(dāng)你確定你的視圖函數(shù)中的定義的所有變量都要傳遞給視圖的時候,你可以使用這個函數(shù) def index(request): user = {'name':'小明',age:18} # 生成的數(shù)據(jù)context = {'user': user} return render(request,'index.html',locals()) #向用戶顯示一個html頁面
3、redirect 函數(shù)
- 說明
具體查看重定向章節(jié)
六牵咙、FBV與CBV
- 說明
FBV派近、CBV是Django視圖路由處理模型,當(dāng)用戶請求送達路由系統(tǒng)URL后洁桌,由其轉(zhuǎn)發(fā)給視圖view來分析并處理
CBV全稱是class base views渴丸,中文名字類通用視圖
FBV全稱是function base views,中文名字視圖函數(shù) - FBV實例
#urls.py from django.conf.urls import url, include urlpatterns = [ url(r‘^index/‘, views.index), ]
#views.py from django.shortcuts import render def index(request): if request.method == ‘POST‘: print(‘method is :‘ + request.method) elif request.method == ‘GET‘: print(‘method is :‘ + request.method) return render(req, ‘index.html‘)
#index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <form action="" method="post"> <input type="text" name="A" /> <input type="submit" name="b" value="提交" /> </form> </body> </html>
- CBV實例
from mytest import views urlpatterns = [ # url(r‘^index/‘, views.index), url(r‘^index/‘, views.Index.as_view()), #注:url(r‘^index/‘, views.Index.as_view()), 是固定用法 ]
#views from django.views import View class Index(View): def get(self, request): print(‘method is :‘ + request.method) return render(request, ‘index.html‘) def post(self, request): print(‘method is :‘ + request.method) return render(request, ‘index.html‘)
?<!--index.html --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <form action="" method="post"> <input type="text" name="A" /> <input type="submit" name="b" value="提交" /> </form> </body> </html>