Django视图(python函数)
1.視圖
- 視圖負(fù)責(zé)接受Web請(qǐng)求HttpRequest,進(jìn)行邏輯處理,返回Web響應(yīng)HttpResponse給請(qǐng)求者
- 響應(yīng)可以是一張網(wǎng)頁(yè)的HTML內(nèi)容,一個(gè)重定向,一個(gè)404錯(cuò)誤等
- 視圖就是python中的函數(shù)
- 視圖一般被定義在“應(yīng)用/views.py”文件中
- 視圖的第一個(gè)參數(shù)必須為HttpRequest實(shí)例,還可能包含下參數(shù)如
- 通過(guò)正則表達(dá)式組獲得的關(guān)鍵字參數(shù)
- 通過(guò)正則表達(dá)式組獲取的位置參數(shù)
- 視圖必須返回一個(gè)HttpResponse對(duì)象或子對(duì)象作為響應(yīng)
?
?
- 視圖處理過(guò)程如下圖:
 
- 使用視圖時(shí)需要進(jìn)行兩方面操作,兩個(gè)操作不分先后
- 配置URLconf
- 在“應(yīng)用/views.py”中定義視圖
?
2.URLconf
?
配置
- 定義urlpatterns列表,存儲(chǔ)url()對(duì)象,這個(gè)名稱是固定的
- urlpatterns中的每個(gè)正則表達(dá)式在第一次訪問(wèn)它們時(shí)被編譯,這使得運(yùn)行很快
?
語(yǔ)法
- 語(yǔ)法一:包含,一般在自定義應(yīng)用中創(chuàng)建一個(gè)urls.py來(lái)定義url
- 這種語(yǔ)法用于test3/urls.py中,目的是將應(yīng)用的urls配置到應(yīng)用內(nèi)部,數(shù)據(jù)更清晰并且易于維護(hù)
url(正則,include('應(yīng)用.urls'))
- 語(yǔ)法二:定義,指定正則和視圖的對(duì)應(yīng)關(guān)系
- 在應(yīng)用內(nèi)部創(chuàng)建urls.py文件,指定請(qǐng)求地址與視圖的對(duì)應(yīng)關(guān)系
url(正則,'視圖名稱')
- 說(shuō)明1:正則部分推薦使用r,表示字符串不轉(zhuǎn)義,這樣在正則表達(dá)式中使用\只寫一個(gè)就可以
- 說(shuō)明2:不能在開(kāi)始加反斜杠,推薦在結(jié)束加反斜杠
正確:index/
 正確:index
 錯(cuò)誤:/index
 錯(cuò)誤:/index/
獲取值
- 請(qǐng)求的url被看做是一個(gè)普通的python字符串,進(jìn)行匹配時(shí)不包括域名、get或post參數(shù)
- 每個(gè)捕獲的參數(shù)都作為一個(gè)普通的python字符串傳遞給視圖
- 如請(qǐng)求地址如下:
http://127.0.0.1:8000/1/?a=10
- 去除掉域名和參數(shù)部分后,只剩下如下部分與正則匹配
/1/
- 獲取值需要在正則表達(dá)式中使用小括號(hào),分為兩種方式
- 位置參數(shù)
- 關(guān)鍵字參數(shù)
- 注意:兩種參數(shù)的方式不要混合使用,在一個(gè)正則表達(dá)式中只能使用一種參數(shù)方式
方式一:位置參數(shù)
- 直接使用小括號(hào),通過(guò)位置參數(shù)傳遞給視圖
- 為了提取參數(shù),修改上面的正則表達(dá)式如下
url(r'^(\d+)/$',views.show1),
方式二:關(guān)鍵字參數(shù)
- 在正則表達(dá)式部分為組命名
- 修改正則表達(dá)式如下
- 其中?P部分表示為這個(gè)參數(shù)定義的名稱為id,可以是其它名稱,起名做到見(jiàn)名知意
url(r'^(?P<id1>\d+)/$',views.show1),
?
3.內(nèi)置錯(cuò)誤視圖
- Django內(nèi)置處理HTTP錯(cuò)誤的視圖,主要錯(cuò)誤及視圖包括
- 404錯(cuò)誤:page not found視圖,將請(qǐng)求地址進(jìn)行url檢測(cè)后,沒(méi)有找到匹配的正則表達(dá)式
- 500錯(cuò)誤:server error視圖,在視圖中代碼運(yùn)行報(bào)錯(cuò)
- 400錯(cuò)誤:bad request視圖,來(lái)自客戶端的安全方面非法操作
- 如果想看到錯(cuò)誤視圖而不是調(diào)試信息,需要修改配置/setting.py文件的DEBUG項(xiàng)
 DEBUG =False
 ALLOWED_HOSTS = ['*', ]
?
4.HttpReqeust對(duì)象
- 服務(wù)器接收到http協(xié)議的請(qǐng)求后,會(huì)根據(jù)報(bào)文創(chuàng)建HttpRequest對(duì)象,這個(gè)對(duì)象不需要我們創(chuàng)建,直接使用服務(wù)器構(gòu)造好的對(duì)象使用就可以
- 視圖的第一個(gè)參數(shù)必須是HttpRequest對(duì)象
- 在django.http模塊中定義了HttpRequest對(duì)象的API
?
屬性
- 下面除非特別說(shuō)明,屬性都是只讀的
- path:一個(gè)字符串,表示請(qǐng)求的頁(yè)面的完整路徑,不包含域名
- method:一個(gè)字符串,表示請(qǐng)求使用的HTTP方法,常用值包括:'GET'、'POST'
- ?????????在瀏覽器中給出地址發(fā)出請(qǐng)求采用get方式,如超鏈接
- ?????????在瀏覽器中點(diǎn)擊表單的提交按鈕發(fā)起請(qǐng)求,如果表單的method設(shè)置為post則為post請(qǐng)求
- encoding:一個(gè)字符串,表示提交的數(shù)據(jù)的編碼方式
- ????如果為None則表示使用瀏覽器的默認(rèn)設(shè)置,一般為utf-8
- ????這個(gè)屬性是可寫的,可以通過(guò)修改它來(lái)修改訪問(wèn)表單數(shù)據(jù)使用的編碼,接下來(lái)對(duì)屬性的任何訪問(wèn)將使用新的encoding值
- GET:一個(gè)類似于字典的對(duì)象,包含get請(qǐng)求方式的所有參數(shù)
- POST:一個(gè)類似于字典的對(duì)象,包含post請(qǐng)求方式的所有參數(shù)
- FILES:一個(gè)類似于字典的對(duì)象,包含所有的上傳文件
- COOKIES:一個(gè)標(biāo)準(zhǔn)的Python字典,包含所有的cookie,鍵和值都為字符串
- session:一個(gè)既可讀又可寫的類似于字典的對(duì)象,表示當(dāng)前的會(huì)話,只有當(dāng)Django 啟用會(huì)話的支持時(shí)才可用,詳細(xì)內(nèi)容見(jiàn)“狀態(tài)保持”
Http定義了與服務(wù)器交互的不同方法,最基本的方法有4種:GET,POST,PUT,DELETE。URL全稱是資源描述符,可以認(rèn)為:一個(gè)URL地址,它用于描述一個(gè)網(wǎng)絡(luò)上的資源,而HTTP中的GET,POST,PUT,DELETE就對(duì)應(yīng)著對(duì)這個(gè)資源的查,改,增,刪。所以GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息。GET方法是通過(guò)改寫URL的方式實(shí)現(xiàn)的。GET的數(shù)據(jù)利用URL?變量名=變量值的方法傳輸。可以用來(lái)用于傳輸一些不重要的數(shù)據(jù)。POST方法用于從客戶端向服務(wù)器提交數(shù)據(jù)。使用POST方法時(shí),URL不再被改寫。數(shù)據(jù)位于http請(qǐng)求的主體。
?
?
5、QueryDict對(duì)象
- 定義在django.http.QueryDict
- HttpRequest對(duì)象的屬性GET、POST都是QueryDict類型的對(duì)象
- 與python字典不同,QueryDict類型的對(duì)象用來(lái)處理同一個(gè)鍵帶有多個(gè)值的情況
?
方法get():根據(jù)鍵獲取值
- 如果一個(gè)鍵同時(shí)擁有多個(gè)值將獲取最后一個(gè)值
- 如果鍵不存在則返回None值,可以設(shè)置默認(rèn)值進(jìn)行后續(xù)處理
dict.get('鍵',默認(rèn)值)
 可簡(jiǎn)寫為dict['鍵']
- 方法getlist():根據(jù)鍵獲取值,值以列表返回,可以獲取指定鍵的所有值
- 如果鍵不存在則返回空列表[],可以設(shè)置默認(rèn)值進(jìn)行后續(xù)處理
dict.getlist('鍵',默認(rèn)值)
?
5.1GET屬性
- 請(qǐng)求格式:在請(qǐng)求地址結(jié)尾使用?,之后以“鍵=值”的格式拼接,多個(gè)鍵值對(duì)之間以&連接
- 例:網(wǎng)址如下
http://www.xinlang.cn/?a=10&b=20&c=python
- 其中的請(qǐng)求參數(shù)為
a=10&b=20&c=python
- 分析請(qǐng)求參數(shù),鍵為'a'、'b'、'c',值為'10'、'20'、'python'
- 在Django中可以使用HttpRequest對(duì)象的GET屬性獲得get方式請(qǐng)求的參數(shù)
- GET屬性返回QueryDict類型的對(duì)象,鍵和值都是字符串類型
- 鍵是開(kāi)發(fā)人員在編寫代碼時(shí)確定下來(lái)的
- 值是根據(jù)數(shù)據(jù)生成的
?
5.2POST屬性
- 使用form表單請(qǐng)求時(shí),method方式為post則會(huì)發(fā)起post方式的請(qǐng)求,需要使用HttpRequest對(duì)象的POST屬性接收參數(shù),POST屬性返回QueryDict類型的對(duì)象
- 問(wèn):表單form如何提交參數(shù)呢?
- 答:控件name屬性的值作為鍵,value屬性的值為值,構(gòu)成鍵值對(duì)提交
- 如果控件沒(méi)有name屬性則不提交
- 對(duì)于checkbox控件,name屬性的值相同為一組,被選中的項(xiàng)會(huì)被提交,出現(xiàn)一鍵多值的情況
- 鍵是控件name屬性的值,是由開(kāi)發(fā)人員編寫的
- 值是用戶填寫或選擇的
?
?
6.HttpResponse對(duì)象
- 視圖在接收請(qǐng)求并處理后,必須返回HttpResponse對(duì)象或子對(duì)象
- 在django.http模塊中定義了HttpResponse對(duì)象的API
- HttpRequest對(duì)象由Django創(chuàng)建,HttpResponse對(duì)象由開(kāi)發(fā)人員創(chuàng)建
?
屬性
- content:表示返回的內(nèi)容
- charset:表示response采用的編碼字符集,默認(rèn)為utf-8
- status_code:返回的HTTP響應(yīng)狀態(tài)碼
- content-type:指定返回?cái)?shù)據(jù)的的MIME類型,默認(rèn)為'text/html'
方法
- init:創(chuàng)建HttpResponse對(duì)象后完成返回內(nèi)容的初始化
- set_cookie:設(shè)置Cookie信息
- write:向響應(yīng)體中寫數(shù)據(jù)
- cookie是網(wǎng)站以鍵值對(duì)格式存儲(chǔ)在瀏覽器中的一段純文本信息,用于實(shí)現(xiàn)用戶跟蹤
- max_age是一個(gè)整數(shù),表示在指定秒數(shù)后過(guò)期
- expires是一個(gè)datetime或timedelta對(duì)象,會(huì)話將在這個(gè)指定的日期/時(shí)間過(guò)期
- max_age與expires二選一
- 如果不指定過(guò)期時(shí)間,則關(guān)閉瀏覽器過(guò)期
set_cookie(key, value='',max_age=None, expires=None)
- delete_cookie(key):刪除指定的key的Cookie,如果key不存在則什么也不發(fā)生
?
調(diào)用模板簡(jiǎn)寫函數(shù)render
- 每次調(diào)用模板時(shí)都要執(zhí)行加載、上下文、渲染三個(gè)步驟,為了簡(jiǎn)化操作,Django定義了render()函數(shù)封裝了以上三個(gè)步驟的代碼,定義在django.shortcuts模塊中
?
6.1子類JsonResponse
- 在瀏覽器中使用javascript發(fā)起ajax請(qǐng)求時(shí),返回json格式的數(shù)據(jù),此處以jquery的get()方法為例
- 類JsonResponse繼承自HttpResponse對(duì)象,被定義在django.http模塊中
- 接收字典作為參數(shù)
- JsonResponse對(duì)象的content-type為‘a(chǎn)pplication/json’
?
- ajax代碼執(zhí)行過(guò)程如下
- 1.發(fā)起請(qǐng)求
- 2.服務(wù)器端視圖執(zhí)行
- 3.執(zhí)行回調(diào)函數(shù)
 
?
?
6.2子類HttpResponseRedirect
- 當(dāng)一個(gè)邏輯處理完成后,不需要向客戶端呈現(xiàn)數(shù)據(jù),而是轉(zhuǎn)回到其它頁(yè)面,如添加成功、修改成功、刪除成功后顯示數(shù)據(jù)列表,而數(shù)據(jù)的列表視圖已經(jīng)開(kāi)發(fā)完成,此時(shí)不需要重新編寫列表的代碼,而是轉(zhuǎn)到這個(gè)視圖就可以,此時(shí)就需要模擬一個(gè)用戶請(qǐng)求的效果,從一個(gè)視圖轉(zhuǎn)到另外一個(gè)視圖,就稱為重定向
- Django中提供了HttpResponseRedirect對(duì)象實(shí)現(xiàn)重定向功能,這個(gè)類繼承自HttpResponse,被定義在django.http模塊中,返回的狀態(tài)碼為302
?
重定向簡(jiǎn)寫函數(shù)redirect
- 在django.shortcuts模塊中為重定向類提供了簡(jiǎn)寫函數(shù)redirect
- 注:返回首頁(yè)redirect('/')
?
?
?
7.狀態(tài)保持
- 瀏覽器請(qǐng)求服務(wù)器是無(wú)狀態(tài)的。無(wú)狀態(tài)指一次用戶請(qǐng)求時(shí),瀏覽器、服務(wù)器無(wú)法知道之前這個(gè)用戶做過(guò)什么,每次請(qǐng)求都是一次新的請(qǐng)求。無(wú)狀態(tài)的應(yīng)用層面的原因是:瀏覽器和服務(wù)器之間的通信都遵守HTTP協(xié)議。根本原因是:瀏覽器與服務(wù)器是使用Socket套接字進(jìn)行通信的,服務(wù)器將請(qǐng)求結(jié)果返回給瀏覽器之后,會(huì)關(guān)閉當(dāng)前的Socket連接,而且服務(wù)器也會(huì)在處理頁(yè)面完畢之后銷毀頁(yè)面對(duì)象。
- 有時(shí)需要保持下來(lái)用戶瀏覽的狀態(tài),比如用戶是否登錄過(guò),瀏覽過(guò)哪些商品等
- 實(shí)現(xiàn)狀態(tài)保持主要有兩種方式:
- 在客戶端存儲(chǔ)信息使用Cookie
- 在服務(wù)器端存儲(chǔ)信息使用Session
?
?
?
7.1Cookie
- Cookie,有時(shí)也用其復(fù)數(shù)形式Cookies,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過(guò)加密)。Cookie最早是網(wǎng)景公司的前雇員Lou Montulli在1993年3月的發(fā)明。Cookie是由服務(wù)器端生成,發(fā)送給User-Agent(一般是瀏覽器),瀏覽器會(huì)將Cookie的key/value保存到某個(gè)目錄下的文本文件內(nèi),下次請(qǐng)求同一網(wǎng)站時(shí)就發(fā)送該Cookie給服務(wù)器(前提是瀏覽器設(shè)置為啟用cookie)。Cookie名稱和值可以由服務(wù)器端開(kāi)發(fā)自己定義,這樣服務(wù)器可以知道該用戶是否合法用戶以及是否需要重新登錄等。服務(wù)器可以利用Cookies包含信息的任意性來(lái)篩選并經(jīng)常性維護(hù)這些信息,以判斷在HTTP傳輸中的狀態(tài)。Cookies最典型的應(yīng)用是判定注冊(cè)用戶是否已經(jīng)登錄網(wǎng)站,用戶可能會(huì)得到提示,是否在下一次進(jìn)入此網(wǎng)站時(shí)保留用戶信息以便簡(jiǎn)化登錄手續(xù),這些都是Cookies的功用。另一個(gè)重要應(yīng)用場(chǎng)合是“購(gòu)物車”之類處理。用戶可能會(huì)在一段時(shí)間內(nèi)在同一家網(wǎng)站的不同頁(yè)面中選擇不同的商品,這些信息都會(huì)寫入Cookies,以便在最后付款時(shí)提取信息。
- Cookie是存儲(chǔ)在瀏覽器中的一段純文本信息,建議不要存儲(chǔ)敏感信息如密碼,因?yàn)殡娔X上的瀏覽器可能被其它人使用
- Cookie以鍵值對(duì)的格式進(jìn)行信息的存儲(chǔ)
- Cookie基于域名安全,不同域名的Cookie是不能互相訪問(wèn)的,如訪問(wèn)xinlan.cn時(shí)向?yàn)g覽器中寫了Cookie信息,使用同一瀏覽器訪問(wèn)baidu.com時(shí),無(wú)法訪問(wèn)到xinlan.cn寫的Cookie信息
- 當(dāng)瀏覽器請(qǐng)求某網(wǎng)站時(shí),會(huì)將本網(wǎng)站下所有Cookie信息提交給服務(wù)器
- 典型應(yīng)用:記住用戶名,網(wǎng)站的廣告推送
- 說(shuō)明:點(diǎn)擊示例網(wǎng)址,這些廣告推送的商品是基于你曾經(jīng)在淘寶上點(diǎn)擊的商品類別等條件篩選出來(lái)的,看上去這是在鳳凰網(wǎng)上訪問(wèn)淘寶網(wǎng)的Cookie,但是事實(shí)不是這樣的,一般是采用iframe標(biāo)簽嵌套一個(gè)淘寶的廣告頁(yè)面到鳳凰網(wǎng)的頁(yè)面上,所以淘寶的Cookie并沒(méi)有被鳳凰網(wǎng)讀取到,而是依然交給淘寶網(wǎng)讀取的,可以通過(guò)“開(kāi)發(fā)者工具”查看元素
?
?
7.2Session
- 對(duì)于敏感、重要的信息,建議要儲(chǔ)在服務(wù)器端,不能存儲(chǔ)在瀏覽器中,如用戶名、余額、等級(jí)、驗(yàn)證碼等信息
- 在服務(wù)器端進(jìn)行狀態(tài)保持的方案就是Session
?
啟用Session
- Django項(xiàng)目默認(rèn)啟用Session
- 打開(kāi)配置/settings.py文件,在項(xiàng)MIDDLEWARE_CLASSES中啟用Session中間件
 
- 禁用Session:將Session中間件刪除
?
存儲(chǔ)方式
- 打開(kāi)配置/settings.py文件,設(shè)置SESSION_ENGINE項(xiàng)指定Session數(shù)據(jù)存儲(chǔ)的方式,可以存儲(chǔ)在數(shù)據(jù)庫(kù)、緩存、Redis等
- 存儲(chǔ)在數(shù)據(jù)庫(kù)中,如下設(shè)置可以寫,也可以不寫,這是默認(rèn)存儲(chǔ)方式
SESSION_ENGINE='django.contrib.sessions.backends.db'
- 存儲(chǔ)在緩存中:存儲(chǔ)在本機(jī)內(nèi)存中,如果丟失則不能找回,比數(shù)據(jù)庫(kù)的方式讀寫更快
SESSION_ENGINE='django.contrib.sessions.backends.cache'
- 混合存儲(chǔ):優(yōu)先從本機(jī)內(nèi)存中存取,如果沒(méi)有則從數(shù)據(jù)庫(kù)中存取
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
?
?
依賴于Cookie
- 所有請(qǐng)求者的Session都會(huì)存儲(chǔ)在服務(wù)器中,服務(wù)器如何區(qū)分請(qǐng)求者和Session數(shù)據(jù)的對(duì)應(yīng)關(guān)系呢?
- 答:在使用Session后,會(huì)在Cookie中存儲(chǔ)一個(gè)sessionid的數(shù)據(jù),每次請(qǐng)求時(shí)瀏覽器都會(huì)將這個(gè)數(shù)據(jù)發(fā)給服務(wù)器,服務(wù)器在接收到sessionid后,會(huì)根據(jù)這個(gè)值找出這個(gè)請(qǐng)求者的Session
- 結(jié)果:如果想使用Session,瀏覽器必須支持Cookie,否則就無(wú)法使用Session了
- 存儲(chǔ)Session時(shí),鍵與Cookie中的sessionid相同,值是開(kāi)發(fā)人員設(shè)置的鍵值對(duì)信息,進(jìn)行了base64編碼,過(guò)期時(shí)間由開(kāi)發(fā)人員設(shè)置
?
?
對(duì)象及方法
- 通過(guò)HttpRequest對(duì)象的Session屬性進(jìn)行會(huì)話的讀寫操作
- 以鍵值對(duì)的格式寫會(huì)話
request.session['鍵']=值
- 根據(jù)鍵讀取值
request.session.get('鍵',默認(rèn)值)
- 清除所有會(huì)話,在存儲(chǔ)中刪除值部分
request.session.clear()
- 清除會(huì)話數(shù)據(jù),在存儲(chǔ)中刪除會(huì)話的整條數(shù)據(jù)
request.session.flush()
- 刪除會(huì)話中的指定鍵及值,在存儲(chǔ)中只刪除某個(gè)鍵及對(duì)應(yīng)的值
del request.session['鍵']
- 設(shè)置會(huì)話的超時(shí)時(shí)間,如果沒(méi)有指定過(guò)期時(shí)間則兩個(gè)星期后過(guò)期
- 如果value是一個(gè)整數(shù),會(huì)話將在value秒沒(méi)有活動(dòng)后過(guò)期
- 如果value為0,那么用戶會(huì)話的Cookie將在用戶的瀏覽器關(guān)閉時(shí)過(guò)期
- 如果value為None,那么會(huì)話永不過(guò)期
request.session.set_expiry(value)
?
?
使用Redis存儲(chǔ)Session
- 會(huì)話還支持文件、純cookie、Memcached、Redis等方式存儲(chǔ)
總結(jié)
以上是生活随笔為你收集整理的Django视图(python函数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: java对象持久化技术_Java对象持久
- 下一篇: java 不重启部署_一篇文章带你搞定S
