1. 程式人生 > >Django 框架 django的請求生命周期

Django 框架 django的請求生命周期

function 客戶 target style cnblogs html網頁 方法 cookies django

概述

首先我們知道HTTP請求及服務端響應中傳輸的所有數據都是字符串,同時http請求是無狀態的,可以通過session和cookie來輔助。

瀏覽器通過ip和端口及路由方式訪問服務端.

在Django中,當我們訪問一個的url時,會通過路由匹配進入相應的html網頁中.

Django的請求生命周期是指當用戶在瀏覽器上輸入url到用戶看到網頁的這個時間段內,Django後臺所發生的事情

而Django的生命周期內到底發生了什麽呢??

1. 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端
請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現在url之中.

2. url經過Django中的wsgi,再經過Django的中間件,最後url到過路由映射表,在路由中一條一條進行匹配, 一旦其中一條匹配成功就執行對應的視圖函數,後面的路由就不再繼續匹配了. wsgi---->中間件------->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()),  #必須是as_view,這是固定寫法
]

視圖信息:

from django.views import View

class CBV(View):
    def get(self,request):             #get請求時觸發
        return render(request, "cbv.html")

    def post(self,request):       #post請求時觸發
        return HttpResponse("cbv.get")

2.1 fbv方式請求的過程

用戶發送url請求,Django會依次遍歷路由映射表中的所有記錄,一旦路由映射表其中的一條匹配成功了,
就執行視圖函數中對應的函數名,這是fbv的執行流程

2.2 cbv方式請求的過程

當服務端使用cbv模式的時候,用戶發給服務端的請求包含url和method,這兩個信息都是字符串類型

服務端通過路由映射表匹配成功後會自動去找dispatch(django內置方法)方法,然後Django會通過dispatch反射的方式找到類中對應的方法並執行

類中的方法執行完畢之後,會把客戶端想要的數據返回給dispatch方法,由dispatch方法把數據返回經客戶端

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

 這時響應體中,包含了cookie的內容

文章來源:https://www.cnblogs.com/renpingsheng/p/7534897.html

Django 框架 django的請求生命周期