django請求的生命週期
1. 概述
首先我們知道HTTP請求及服務端響應中傳輸的所有資料都是字串.
在Django中,當我們訪問一個的url時,會通過路由匹配進入相應的html網頁中.
Django的請求生命週期是指當用戶在瀏覽器上輸入url到使用者看到網頁的這個時間段內,Django後臺所發生的事情
而Django的生命週期內到底發生了什麼呢??
1. 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端 請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現在url之中. 2. url經過Django中的wsgi,再經過Django的中介軟體,最後url到過路由對映表,在路由中一條一條進行匹配, 一旦其中一條匹配成功就執行對應的檢視函式,後面的路由就不再繼續匹配了. 3. 檢視函式根據客戶端的請求查詢相應的資料.返回給Django,然後Django把客戶端想要的資料做為一個字串返回給客戶端. 4. 客戶端瀏覽器接收到返回的資料,經過渲染後顯示給使用者.
檢視函式根據客戶端的請求查詢相應的資料後.如果同時有多個客戶端同時傳送不同的url到服務端請求資料
服務端查詢到資料後,怎麼知道要把哪些資料返回給哪個客戶端呢??
因此客戶端發到服務端的url中還必須要包含所要請求的資料資訊等內容.
例如,http://www.aaa.com/index/?nid=user
這個url中,
客戶端通過get請求向服務端傳送的nid=user
的請求,服務端可以通過request.GET.get("nid")
的方式取得nid資料
客戶端還可以通過post的方式向服務端請求資料.
當客戶端以post的方式向服務端請求資料的時候,請求的資料包含在請求體裡,這時服務端就使用request.POST的方式取得客戶端想要取得的資料
需要注意的是,request.POST是把請求體的資料轉換一個字典,請求體中的資料預設是以字串的形式存在的.
2. FBV模式和CBV模式
一個url對應一個檢視函式,這個模式叫做FBV(Function Base Views
)
除了FBV之處,Django中還有另外一種模式叫做CBV(Class Base views
),即一個url對應一個類
例子:使用cbv模式來請求網頁
路由資訊:
urlpatterns = [ url(r'^fbv/',views.fbv), url(r'^cbv/',views.CBV.as_view()), ]
檢視函式配置:
from django.views import View class CBV(View): def get(self,request): return render(request, "cbv.html") def post(self,request): return HttpResponse("cbv.get")
cbv.html網頁的內容:
<body> <form method="post" action="/cbv/"> {% csrf_token %} <input type="text"> <input type="submit"> </form> </body>
啟動專案,在瀏覽器中輸入http://127.0.0.1:8000/cbv/
,回車,得到的網頁如下:
在input框中輸入"hello",後回車,得到的網頁如下:
使用fbv的模式,在url匹配成功之後,會直接執行對應的檢視函式.
而如果使用cbv模式,在url匹配成功之後,會找到檢視函式中對應的類,然後這個類回到請求頭中找到對應的Request Method
.
如果是客戶端以post的方式提交請求,就執行類中的post方法;
如果是客戶端以get的方式提交請求,就執行類中的get方法
然後查詢使用者發過來的url,然後在類中執行對應的方法查詢生成使用者需要的資料.
2.1 fbv方式請求的過程
使用者傳送url請求,Django會依次遍歷路由對映表中的所有記錄,一旦路由對映表其中的一條匹配成功了,
就執行檢視函式中對應的函式名,這是fbv的執行流程
2.2 cbv方式請求的過程
當服務端使用cbv模式的時候,使用者發給服務端的請求包含url和method,這兩個資訊都是字串型別
服務端通過路由對映表匹配成功後會自動去找dispatch方法,然後Django會通過dispatch反射的方式找到類中對應的方法並執行
類中的方法執行完畢之後,會把客戶端想要的資料返回給dispatch方法,由dispatch方法把資料返回經客戶端
例子,把上面的例子中的檢視函式修改成如下:
from django.views import View class CBV(View): def dispatch(self, request, *args, **kwargs): print("dispatch......") res=super(CBV,self).dispatch(request,*args,**kwargs) return res def get(self,request): return render(request, "cbv.html") def post(self,request): return HttpResponse("cbv.get")
列印結果:
<HttpResponse status_code=200, "text/html; charset=utf-8"> dispatch...... <HttpResponse status_code=200, "text/html; charset=utf-8">
需要注意的是:
以get方式請求資料時,請求頭裡有資訊,請求體裡沒有資料
以post請求資料時,請求頭和請求體裡都有資料.
3. Django請求生命週期之響應內容
http提交資料的方式有"post"
,"get"
,"put"
,"patch"
,"delete"
,"head"
,"options"
,"trace"
.
提交資料的時候,服務端依據method的不同會觸發不同的檢視函式.
對於from表單來說,提交資料只有get和post兩種方法
另外的方法可以通過Ajax方法來提交
服務端根據個人請求資訊的不同來操作資料庫,可以使用原生的SQL語句,也可以使用Django的ORM語句.
Django從資料庫中查詢處理完使用者想要的資料,將結果返回給使用者.
從Django中返回的響應內容包含響應頭和響應體
在Django中,有的時候一個檢視函式,執行完成後會使用HttpResponse來返回一個字串給客戶端.
這個字串只是響應體的部分,返回給客戶端的響應頭的部分應該怎麼設定呢???
為返回給客戶端的資訊加一個響應頭:
修改上面例子的檢視函式為如下:
from django.views import View class CBV(View): def dispatch(self, request, *args, **kwargs): print("dispatch......") res=super(CBV,self).dispatch(request,*args,**kwargs) print(res) return res def get(self,request): return render(request, "cbv.html") def post(self,request): res=HttpResponse("cbv.post") res.set_cookie("k2","v2") res.set_cookie("k4","v4") print("res:",res) print("request.cookie:",request.COOKIES) return res
列印的資訊:
res: <HttpResponse status_code=200, "text/html; charset=utf-8"> request.cookie: {'csrftoken': 'jmX9H1455MYzDRQs8cQLrA23K0aCGoHpINL50GnMVxhUjamI8wgmOP7D2wXcpjHb', 'k2': 'v2', 'k4': 'v4'}
首先我們知道HTTP請求及服務端響應中傳輸的所有資料都是字串.
在Django中,當我們訪問一個的url時,會通過路由匹配進入相應的html網頁中.
Django的請求生命週期是指當用戶在瀏覽器上輸入url到使用者看到網頁的這個時間段內,Django後臺所發生的事情
而Django的生命週期內到底發生了什麼呢??
1. 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端
請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現在url之中.
2. url經過Django中的wsgi,再經過Django的中介軟體,最後url到過路由對映表,在路由中一條一條進行匹配,
一旦其中一條匹配成功就執行對應的檢視函式,後面的路由就不再繼續匹配了.
3. 檢視函式根據客戶端的請求查詢相應的資料.返回給Django,然後Django把客戶端想要的資料做為一個字串返回給客戶端.
4. 客戶端瀏覽器接收到返回的資料,經過渲染後顯示給使用者.
檢視函式根據客戶端的請求查詢相應的資料後.如果同時有多個客戶端同時傳送不同的url到服務端請求資料
服務端查詢到資料後,怎麼知道要把哪些資料返回給哪個客戶端呢??
因此客戶端發到服務端的url中還必須要包含所要請求的資料資訊等內容.
例如,http://www.aaa.com/index/?nid=user
這個url中,
客戶端通過get請求向服務端傳送的nid=user
的請求,服務端可以通過request.GET.get("nid")
的方式取得nid資料
客戶端還可以通過post的方式向服務端請求資料.
當客戶端以post的方式向服務端請求資料的時候,請求的資料包含在請求體裡,這時服務端就使用request.POST的方式取得客戶端想要取得的資料
需要注意的是,request.POST是把請求體的資料轉換一個字典,請求體中的資料預設是以字串的形式存在的.
2. FBV模式和CBV模式
一個url對應一個檢視函式,這個模式叫做FBV(Function Base Views
)
除了FBV之處,Django中還有另外一種模式叫做CBV(Class Base views
),即一個url對應一個類
例子:使用cbv模式來請求網頁
路由資訊:
urlpatterns = [ url(r'^fbv/',views.fbv), url(r'^cbv/',views.CBV.as_view()), ]
檢視函式配置:
from django.views import View class CBV(View): def get(self,request): return render(request, "cbv.html") def post(self,request): return HttpResponse("cbv.get")
cbv.html網頁的內容:
<body> <form method="post" action="/cbv/"> {% csrf_token %} <input type="text"> <input type="submit"> </form> </body>
啟動專案,在瀏覽器中輸入http://127.0.0.1:8000/cbv/
,回車,得到的網頁如下:
在input框中輸入"hello",後回車,得到的網頁如下:
使用fbv的模式,在url匹配成功之後,會直接執行對應的檢視函式.
而如果使用cbv模式,在url匹配成功之後,會找到檢視函式中對應的類,然後這個類回到請求頭中找到對應的Request Method
.
如果是客戶端以post的方式提交請求,就執行類中的post方法;
如果是客戶端以get的方式提交請求,就執行類中的get方法
然後查詢使用者發過來的url,然後在類中執行對應的方法查詢生成使用者需要的資料.
2.1 fbv方式請求的過程
使用者傳送url請求,Django會依次遍歷路由對映表中的所有記錄,一旦路由對映表其中的一條匹配成功了,
就執行檢視函式中對應的函式名,這是fbv的執行流程
2.2 cbv方式請求的過程
當服務端使用cbv模式的時候,使用者發給服務端的請求包含url和method,這兩個資訊都是字串型別
服務端通過路由對映表匹配成功後會自動去找dispatch方法,然後Django會通過dispatch反射的方式找到類中對應的方法並執行
類中的方法執行完畢之後,會把客戶端想要的資料返回給dispatch方法,由dispatch方法把資料返回經客戶端
例子,把上面的例子中的檢視函式修改成如下:
from django.views import View class CBV(View): def dispatch(self, request, *args, **kwargs): print("dispatch......") res=super(CBV,self).dispatch(request,*args,**kwargs) return res def get(self,request): return render(request, "cbv.html") def post(self,request): return HttpResponse("cbv.get")
列印結果:
<HttpResponse status_code=200, "text/html; charset=utf-8"> dispatch...... <HttpResponse status_code=200, "text/html; charset=utf-8">
需要注意的是:
以get方式請求資料時,請求頭裡有資訊,請求體裡沒有資料
以post請求資料時,請求頭和請求體裡都有資料.
3. Django請求生命週期之響應內容
http提交資料的方式有"post"
,"get"
,"put"
,"patch"
,"delete"
,"head"
,"options"
,"trace"
.
提交資料的時候,服務端依據method的不同會觸發不同的檢視函式.
對於from表單來說,提交資料只有get和post兩種方法
另外的方法可以通過Ajax方法來提交
服務端根據個人請求資訊的不同來操作資料庫,可以使用原生的SQL語句,也可以使用Django的ORM語句.
Django從資料庫中查詢處理完使用者想要的資料,將結果返回給使用者.
從Django中返回的響應內容包含響應頭和響應體
在Django中,有的時候一個檢視函式,執行完成後會使用HttpResponse來返回一個字串給客戶端.
這個字串只是響應體的部分,返回給客戶端的響應頭的部分應該怎麼設定呢???
為返回給客戶端的資訊加一個響應頭:
修改上面例子的檢視函式為如下:
from django.views import View class CBV(View): def dispatch(self, request, *args, **kwargs): print("dispatch......") res=super(CBV,self).dispatch(request,*args,**kwargs) print(res) return res def get(self,request): return render(request, "cbv.html") def post(self,request): res=HttpResponse("cbv.post") res.set_cookie("k2","v2") res.set_cookie("k4","v4") print("res:",res) print("request.cookie:",request.COOKIES) return res
列印的資訊:
res: <HttpResponse status_code=200, "text/html; charset=utf-8"> request.cookie: {'csrftoken': 'jmX9H1455MYzDRQs8cQLrA23K0aCGoHpINL50GnMVxhUjamI8wgmOP7D2wXcpjHb', 'k2': 'v2', 'k4': 'v4'}