中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django請求的生命周期是啥

發布時間:2020-08-26 16:06:22 來源:億速云 閱讀:128 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關Django請求的生命周期是啥,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

首先我們知道HTTP請求及服務端響應中傳輸的所有數據都是字符串。在Django中,當我們訪問一個的url時,會通過路由匹配進入相應的html網頁中。Django的請求生命周期是指當用戶在瀏覽器上輸入url到用戶看到網頁的這個時間段內,Django后臺所發生的事情。

1.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/,回車,得到的網頁如下:

Django請求的生命周期是啥

在input框中輸入"hello",后回車,得到的網頁如下:

Django請求的生命周期是啥

使用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'}

上述就是小編為大家分享的Django請求的生命周期是啥了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北川| 齐齐哈尔市| 永嘉县| 青海省| 台南市| 永定县| 玉溪市| 紫金县| 泗阳县| 巨鹿县| 金堂县| 舒兰市| 正阳县| 克山县| 荔波县| 旅游| 娄底市| 杨浦区| 醴陵市| 阿鲁科尔沁旗| 南皮县| 淮南市| 牡丹江市| 襄樊市| 梅州市| 荥经县| 浏阳市| 浦城县| 普兰店市| 青浦区| 平山县| 金沙县| 鲁甸县| 井冈山市| 连江县| 辽阳市| 定结县| 瑞昌市| 吴堡县| 玉溪市| 无锡市|