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