成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Django請(qǐng)求的生命周期是啥-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、鼓樓ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的鼓樓網(wǎng)站制作公司

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Django請(qǐng)求的生命周期是啥,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

首先我們知道HTTP請(qǐng)求及服務(wù)端響應(yīng)中傳輸?shù)乃袛?shù)據(jù)都是字符串。在Django中,當(dāng)我們訪問一個(gè)的url時(shí),會(huì)通過路由匹配進(jìn)入相應(yīng)的html網(wǎng)頁中。Django的請(qǐng)求生命周期是指當(dāng)用戶在瀏覽器上輸入url到用戶看到網(wǎng)頁的這個(gè)時(shí)間段內(nèi),Django后臺(tái)所發(fā)生的事情。

1.Django的生命周期內(nèi)到底發(fā)生了什么呢??

1. 當(dāng)用戶在瀏覽器中輸入url時(shí),瀏覽器會(huì)生成請(qǐng)求頭和請(qǐng)求體發(fā)給服務(wù)端,請(qǐng)求頭和請(qǐng)求體中會(huì)包含瀏覽器的動(dòng)作(action),這個(gè)動(dòng)作通常為get或者post,體現(xiàn)在url之中。

2. url經(jīng)過Django中的wsgi,再經(jīng)過Django的中間件,最后url到過路由映射表,在路由中一條一條進(jìn)行匹配,一旦其中一條匹配成功就執(zhí)行對(duì)應(yīng)的視圖函數(shù),后面的路由就不再繼續(xù)匹配了。

3. 視圖函數(shù)根據(jù)客戶端的請(qǐng)求查詢相應(yīng)的數(shù)據(jù).返回給Django,然后Django把客戶端想要的數(shù)據(jù)做為一個(gè)字符串返回給客戶端。

4. 客戶端瀏覽器接收到返回的數(shù)據(jù),經(jīng)過渲染后顯示給用戶。

視圖函數(shù)根據(jù)客戶端的請(qǐng)求查詢相應(yīng)的數(shù)據(jù)后.如果同時(shí)有多個(gè)客戶端同時(shí)發(fā)送不同的url到服務(wù)端請(qǐng)求數(shù)據(jù)。

服務(wù)端查詢到數(shù)據(jù)后,怎么知道要把哪些數(shù)據(jù)返回給哪個(gè)客戶端呢??

因此客戶端發(fā)到服務(wù)端的url中還必須要包含所要請(qǐng)求的數(shù)據(jù)信息等內(nèi)容。

例如,http://www.aaa.com/index/?nid=user這個(gè)url中,

客戶端通過get請(qǐng)求向服務(wù)端發(fā)送的nid=user的請(qǐng)求,服務(wù)端可以通過request.GET.get("nid")的方式取得nid數(shù)據(jù)。

客戶端還可以通過post的方式向服務(wù)端請(qǐng)求數(shù)據(jù)。

當(dāng)客戶端以post的方式向服務(wù)端請(qǐng)求數(shù)據(jù)的時(shí)候,請(qǐng)求的數(shù)據(jù)包含在請(qǐng)求體里,這時(shí)服務(wù)端就使用request.POST的方式取得客戶端想要取得的數(shù)據(jù)。

需要注意的是,request.POST是把請(qǐng)求體的數(shù)據(jù)轉(zhuǎn)換一個(gè)字典,請(qǐng)求體中的數(shù)據(jù)默認(rèn)是以字符串的形式存在的。

2. FBV模式和CBV模式

一個(gè)url對(duì)應(yīng)一個(gè)視圖函數(shù),這個(gè)模式叫做FBV(Function Base Views)

除了FBV之處,Django中還有另外一種模式叫做CBV(Class Base views),即一個(gè)url對(duì)應(yīng)一個(gè)類。

例子:使用cbv模式來請(qǐng)求網(wǎng)頁

路由信息:

urlpatterns = [
    url(r'^fbv/',views.fbv),
    url(r'^cbv/',views.CBV.as_view()),
]

視圖函數(shù)配置:

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網(wǎng)頁的內(nèi)容:

<body>
<form method="post" action="/cbv/">
    {% csrf_token %}
    <input type="text">
    <input type="submit">
</form>
</body>

啟動(dòng)項(xiàng)目,在瀏覽器中輸入http://127.0.0.1:8000/cbv/,回車,得到的網(wǎng)頁如下:

Django請(qǐng)求的生命周期是啥

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

Django請(qǐng)求的生命周期是啥

使用fbv的模式,在url匹配成功之后,會(huì)直接執(zhí)行對(duì)應(yīng)的視圖函數(shù)。

而如果使用cbv模式,在url匹配成功之后,會(huì)找到視圖函數(shù)中對(duì)應(yīng)的類,然后這個(gè)類回到請(qǐng)求頭中找到對(duì)應(yīng)的Request Method。

如果是客戶端以post的方式提交請(qǐng)求,就執(zhí)行類中的post方法;

如果是客戶端以get的方式提交請(qǐng)求,就執(zhí)行類中的get方法;

然后查找用戶發(fā)過來的url,然后在類中執(zhí)行對(duì)應(yīng)的方法查詢生成用戶需要的數(shù)據(jù)。

2.1 fbv方式請(qǐng)求的過程

用戶發(fā)送url請(qǐng)求,Django會(huì)依次遍歷路由映射表中的所有記錄,一旦路由映射表其中的一條匹配成功了,

就執(zhí)行視圖函數(shù)中對(duì)應(yīng)的函數(shù)名,這是fbv的執(zhí)行流程。

2.2 cbv方式請(qǐng)求的過程

當(dāng)服務(wù)端使用cbv模式的時(shí)候,用戶發(fā)給服務(wù)端的請(qǐng)求包含url和method,這兩個(gè)信息都是字符串類型。

服務(wù)端通過路由映射表匹配成功后會(huì)自動(dòng)去找dispatch方法,然后Django會(huì)通過dispatch反射的方式找到類中對(duì)應(yīng)的方法并執(zhí)行。

類中的方法執(zhí)行完畢之后,會(huì)把客戶端想要的數(shù)據(jù)返回給dispatch方法,由dispatch方法把數(shù)據(jù)返回經(jīng)客戶端。

例子,把上面的例子中的視圖函數(shù)修改成如下:

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")

打印結(jié)果:

<HttpResponse status_code=200, "text/html; charset=utf-8">
dispatch......
<HttpResponse status_code=200, "text/html; charset=utf-8">

需要注意的是:

以get方式請(qǐng)求數(shù)據(jù)時(shí),請(qǐng)求頭里有信息,請(qǐng)求體里沒有數(shù)據(jù)

以post請(qǐng)求數(shù)據(jù)時(shí),請(qǐng)求頭和請(qǐng)求體里都有數(shù)據(jù).    

3. Django請(qǐng)求生命周期之響應(yīng)內(nèi)容

http提交數(shù)據(jù)的方式有"post","get","put","patch","delete","head","options","trace".

提交數(shù)據(jù)的時(shí)候,服務(wù)端依據(jù)method的不同會(huì)觸發(fā)不同的視圖函數(shù).

對(duì)于from表單來說,提交數(shù)據(jù)只有g(shù)et和post兩種方法

另外的方法可以通過Ajax方法來提交

服務(wù)端根據(jù)個(gè)人請(qǐng)求信息的不同來操作數(shù)據(jù)庫,可以使用原生的SQL語句,也可以使用Django的ORM語句.

Django從數(shù)據(jù)庫中查詢處理完用戶想要的數(shù)據(jù),將結(jié)果返回給用戶.

從Django中返回的響應(yīng)內(nèi)容包含響應(yīng)頭和響應(yīng)體

在Django中,有的時(shí)候一個(gè)視圖函數(shù),執(zhí)行完成后會(huì)使用HttpResponse來返回一個(gè)字符串給客戶端.

這個(gè)字符串只是響應(yīng)體的部分,返回給客戶端的響應(yīng)頭的部分應(yīng)該怎么設(shè)置呢???

為返回給客戶端的信息加一個(gè)響應(yīng)頭:

修改上面例子的視圖函數(shù)為如下:

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請(qǐng)求的生命周期是啥了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。

網(wǎng)頁名稱:Django請(qǐng)求的生命周期是啥-創(chuàng)新互聯(lián)
文章URL:http://jinyejixie.com/article36/disopg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、ChatGPT、響應(yīng)式網(wǎng)站、品牌網(wǎng)站制作、網(wǎng)站排名網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
改则县| 鹤峰县| 万宁市| 婺源县| 潼南县| 陇西县| 大方县| 洛隆县| 醴陵市| 乳山市| 木里| 鸡泽县| 沙坪坝区| 隆昌县| 林州市| 城固县| 南靖县| 昌宁县| 镇宁| 天镇县| 瑞昌市| 高陵县| 房山区| 东乡县| 永兴县| 织金县| 乐业县| 拉萨市| 镇康县| 麻栗坡县| 文水县| 莱芜市| 密山市| 瑞金市| 大安市| 柳林县| 吴旗县| 沅陵县| 阿拉善右旗| 绍兴县| 景宁|