一、概要
視圖可以一個python函數,可以叫視圖函數,或者簡稱視圖,也可以是是一個類,定義在views.py 文件中。
主要用于接收并處理請求,調用模型層和模板層,響應請求(返回HttpResponse或其子類)每一個用戶請求,都對應著一個視圖(和url地址),由視圖處理請求后,再返回html頁面內容給瀏覽器顯示。在http請求中產生兩個核心對象,所在位置是,django.http
二、核心對象
- http請求:HttpRequest對象
- http響應:HttpResponse對象
三、HttpRequest對象
1、說明
當請求一個頁面時,Django 創建一個 HttpRequest對象包含原數據的請求。然后 Django 加載適當的視圖,通過 HttpRequest作為視圖函數的第一個參數。每個視圖負責返回一個HttpResponse目標
2、屬性
2.1、GET
- 說明
一個類似于字典的對象,如果請求中包含表單數據,則將這些數據封裝成 QueryDict 對象 - 舉個栗子
value = request.GET.get('key',default=None)
2.2、POST
- 說明
一個類似于字典的對象,如果請求中包含表單數據,則將這些數據封裝成 QueryDict 對象。 - 栗子
value = request.POST.get('key',default=None)
2.3、path
- 說明
請求頁面的全路徑,不包括域名和參數 - 栗子
/index/ /shop/list/
2.4、method
- 說明
請求中使用的HTTP方法的字符串表示。全大寫表示 - 示例
if request.method=='GET': #這里是get請求 elif request.method ='POST': #這里是post請求
2.5、COOKIES
- 說明
包含所有cookies的標準Python字典對象;keys和values都是字符串。 - 示例代碼
查看會話機制專題
2.6、session
- 說明
唯一可讀寫的屬性,代表當前會話的字典對象;自己有激活Django中的session支持時該屬性才可用。 - 栗子
查看會話機制專題
2.7、FILES
- 說明
包含所有上傳文件的類字典對象;
FILES中的每一個Key都是'<input type="file" name="" />'標簽中 name屬性的值,FILES中的每一個value同時也是一個標準的python字典對象
注意,FILES 只有在請求的方法為POST 且提交的<form>
帶有enctype="multipart/form-data"
的情況下才會包含數據。否則,FILES 將為一個空的類似于字典的對象 - 栗子
查看文件上傳相關
2.8、user
- 說明
一個AUTH_USER_MODEL
類型的對象,表示當前登錄的用戶。
如果用戶當前沒有登錄,user
將設置為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
- 說明
一個字符串,表示提交的數據的編碼方式(如果為 None 則表示使用 DEFAULT_CHARSET 的設置,默認為 'utf-8')。這個屬性是可寫的,你可以修改它來修改訪問表單數據使用的編碼。
接下來對屬性的任何訪問(例如從 GET 或 POST 中讀取數據)將使用新的 encoding 值。
如果你知道表單數據的編碼不是 DEFAULT_CHARSET ,則使用它。
2.10、META
- 說明
一個標準的Python字典包含所有可用的HTTP頭。可用標題取決于客戶端和服務器
- 栗子
- CONTENT_LENGTH
請求體的長度(一個字符串)。 - CONTENT_TYPE
請求體的類型。 - HTTP_ACCEPT
為響應–可以接受的內容類型。 - HTTP_ACCEPT_ENCODING
接受編碼的響應 - HTTP_ACCEPT_LANGUAGE
接受語言的反應 - HTTP_HOST
客戶端發送的HTTP主機頭。 - HTTP_REFERER
參考頁面 - HTTP_USER_AGENT
客戶端的用戶代理字符串。 - QUERY_STRING
查詢字符串,作為一個單一的(分析的)字符串。 - REMOTE_ADDR
客戶端的IP地址 - REMOTE_HOST
客戶端的主機名 - REMOTE_USER
用戶通過Web服務器的身份驗證 - REQUEST_METHOD
字符串,如"GET"或"POST" - SERVER_NAME
服務器的主機名 - SERVER_PORT
服務器的端口(一個字符串)
- CONTENT_LENGTH
3、方法
3.1、get_host()
- 說明
根據從HTTP_X_FORWARDED_HOST(如果打開 USE_X_FORWARDED_HOST,默認為False)和 HTTP_HOST 頭部信息返回請求的原始主機。
注意:當主機位于多個代理后面時,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 發起的。
3.4、is_ajax()
- 說明
判斷是否是ajax請求
四、HttpResponse對象
1、說明
對于HttpRequest對象來說,是由django自動創建的,但是,HttpResponse對象就必須我們自己創建。每個view請求處理方法必須返回一個HttpResponse對象
2、主要的屬性
- content:表示返回的內容,字符串類型
- charset:表示response采用的編碼字符集,字符串類型
- status_code:響應的HTTP響應狀態碼,默認是200
- content-type:指定輸出的MIME類型
3、主要的方法
- init
使用頁內容實例化HttpResponse對象 - write(content)
以文件的方式寫 - flush():
以文件的方式輸出緩存區 - set_cookie
設置Cookie,具體的使用看會話章節
4、HttpResponse的常見的子類
4.1、JsonResponse
- 說明
這個類是HttpRespon的子類,返回json類型的數據,它的默認Content-Type 被設置為: application/json - 構造方法
JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)
- 參數說明
- data
一個字典類型的數據 - encoder
json生成器 - safe
默認的safe 參數是 True. 如果你傳入的data數據類型不是字典類型,那么它就會拋出 TypeError的異常,如果設置為False ,那data可以填入任何能被轉換為JSON格式的對象,比如list, tuple, set。 - json_dumps_params
一個字典,它將調用json.dumps()方法并將字典中的參數傳入給該方法
- 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) ''' 注意: 如果不設置safe=False 將會拋出 TypeError錯誤 '''
4.2、TemplateResponse
- 說明
是SimpleTemplateResponse
的子類,而SimpleTemplateResponse又繼承自HttpResponse
主要的作用是將模板渲染成HTML字符串返回給客服端,具體看快捷方法中的render函數
4.3、HttpResponseRedirect
- 說明
重定向,服務器端跳轉
具體看細節看重定向章節
五、快捷方法
1、說明
- 頁面渲染:render(推薦),render_to_response,
- 頁面跳轉:redirect
- locals: 可以直接將對應視圖函數中所有的變量傳給模板
2、render
- 方法
render(request, template_name, context=None, content_type=None, status=None,using=None)
- 參數說明
- request
請求 - template_name(必選)
一個模板的使用或模板序列名稱全稱。如果序列是給定的,存在于第一個模板將被使用 - context(可選)
一組字典的值添加到模板中。默認情況下,這是一個空的字典。 - content_type(可選)
MIME類型用于生成文檔。 - status (可選)
為響應狀態代碼。默認值為200 -
using
用于加載模板使用的模板引擎的NAME。
- request
- 示例代碼
# 純靜態界面渲染 def index(request): return render(request,'index.html') #向用戶顯示一個html頁面
# 配合傳遞數據配合模板語法使用 def index(request): data={'user':{'name':'小明',age:18}} return render(request,'index.html',context=data) #向用戶顯示一個html頁面
# 也可以使用簡寫方式 locals()函數,他會將視圖函數中的所有局部變量封裝到字典中 # 主要在開發中盡量不要使用,尤其數據比較復雜的時候,因為有可能有的數據不一定會使用 # 所以當你確定你的視圖函數中的定義的所有變量都要傳遞給視圖的時候,你可以使用這個函數 def index(request): user = {'name':'小明',age:18} # 生成的數據context = {'user': user} return render(request,'index.html',locals()) #向用戶顯示一個html頁面
3、redirect 函數
- 說明
具體查看重定向章節
六、FBV與CBV
- 說明
FBV、CBV是Django視圖路由處理模型,當用戶請求送達路由系統URL后,由其轉發給視圖view來分析并處理
CBV全稱是class base views,中文名字類通用視圖
FBV全稱是function base views,中文名字視圖函數 - 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>