1. URLConf
- 瀏覽器訪問(wèn)地址由哪個(gè)視圖處理有url決定们衙。創(chuàng)建django項(xiàng)目時(shí)谍倦,默認(rèn)已在setting.py中配置好了url配置入口:
默認(rèn)url配置.png- 一般在項(xiàng)目urls.py中包含應(yīng)用的urls.py,在應(yīng)用的urls.py中創(chuàng)建具體匹配;
- urls.py內(nèi)容為urlpatterns,為url()對(duì)象列表。url()在django.conf.urls中定義墓猎,有兩種用法:
url(r'^', include('booktest.urls')) # 包含應(yīng)用中urls
url(r'^$', views.index) # 指向應(yīng)用中具體視圖
注意:正則部分前面推薦使用'r',表示字符串不轉(zhuǎn)義祷膳,另外匹配的字符串前面不能有'/'陶衅。請(qǐng)求url按普通字符串匹配,不包括域名以及get或post參數(shù)直晨。
2. 視圖
2.1 獲取請(qǐng)求參數(shù)
- 直接在請(qǐng)求匹配中獲取參數(shù)需要在正則表達(dá)式中使用小括號(hào)搀军,有兩種使用方式:
- 位置參數(shù):按位置依次在視圖內(nèi)接收小括號(hào)中的值;
- 關(guān)鍵字參數(shù):使用“?P<參數(shù)名>”勇皇,例:
url(r'book/(?P<bookid>\d+)$', views.detais)
2.2 內(nèi)置錯(cuò)誤視圖
- django內(nèi)置404 Page Not Found視圖和500 server error視圖罩句。
- 要顯示錯(cuò)誤視圖而不是錯(cuò)誤信息,需將默認(rèn)debug改為False:
關(guān)閉調(diào)試模式.png默認(rèn)404.png默認(rèn)500.png- 可以自定義404.html和500.html(模板查詢有順序敛摘,按一定路徑找不到后使用默認(rèn)頁(yè)面):
自定義錯(cuò)誤頁(yè)面.png
2.3 HttpRequest對(duì)象
django收到請(qǐng)求后门烂,會(huì)根據(jù)報(bào)文創(chuàng)建HttpResquest對(duì)象,必須在視圖的第一個(gè)參數(shù)兄淫。
- 屬性(除非特殊說(shuō)明屯远,否則屬性都是只讀的):
- path:完整請(qǐng)求路徑,不包含域名和請(qǐng)求參數(shù)捕虽;
- method:請(qǐng)求方法慨丐,常用的有'GET'和'POST';
- encoding:提交數(shù)據(jù)的編碼方式泄私,None表示使用瀏覽器默認(rèn)編碼方式房揭,一般為utf8。注意這是一個(gè)可寫屬性晌端,修改后對(duì)屬性的接收使用的是新的編碼方式:
utf8編碼接收參數(shù).pnggbk編碼接收參數(shù).png
- GET:QueryDict類型對(duì)象捅暴,類似于python字典,包含get方式請(qǐng)求的所有參數(shù)咧纠;
- POST:QueryDict類型對(duì)象蓬痒,類似于字典,包含post方式請(qǐng)求的所有參數(shù)漆羔;
- FILES:類似于字典的對(duì)象,包含上傳的所有文件贞谓;
- COOKIES:標(biāo)準(zhǔn)的python字典,包含所有cookies,鍵和值都是字符串赁遗;
- session:類字典對(duì)象,表示當(dāng)前會(huì)話撰洗。注意session也是一個(gè)即可讀又可寫屬性捞挥;
- QueryDict對(duì)象:
- 定義在django.http.QueryDict;
- 用來(lái)處理同一個(gè)鍵對(duì)多個(gè)值的情況诊沪;
- 方法:
get('key')
:如果有多個(gè)值獲取最后一個(gè)养筒,沒(méi)有返回None;get('key'端姚,'default')
:沒(méi)有時(shí)返回default值晕粪;getlist('key')
:返回值列表,如果沒(méi)有返回[]渐裸;getlist('key', 'default')
:如果沒(méi)有巫湘,返回default值。
2.4 HttpResponse對(duì)象
HttpRequest對(duì)象由django創(chuàng)建昏鹃,HttpResponse對(duì)象需要用戶自定義尚氛。
- 屬性:
- content:返回的內(nèi)容
- charset:response采用的編碼字符集,默認(rèn)為utf-8洞渤;
- status_code:響應(yīng)碼阅嘶;
- 方法:
- set_cookie:
set_cookie('key', value='', max_age=None, expires=None)
- max_age:指定秒后過(guò)期;
- expires:datetime或timedelta對(duì)象载迄,會(huì)話將在這個(gè)指定的日期/時(shí)間過(guò)期讯柔;
- max_age和expires二選一。如果不指定過(guò)期時(shí)間护昧,則在關(guān)閉瀏覽器時(shí)cookie過(guò)期魂迄。
- del_cookie(key):如果key不存在則不作任何處理;
- write():向響應(yīng)體中寫數(shù)據(jù)捏卓;
設(shè)置response.png
2.4.1 子類JsonResponse
繼承自Response极祸,定義在django.http模塊,創(chuàng)建對(duì)象時(shí)接受字典作為參數(shù)怠晴。JsonResonse對(duì)象的Content-Type為'application/json'遥金。
- 添加jquery文件:
添加jquery文件.png- 配置靜態(tài)文件查找目錄:
配置靜態(tài)文件加載目錄.png- 配置url,定義視圖
- 定義頁(yè)面:
頁(yè)面.png- 視圖:
jsonresponse視圖.png- 效果:
json效果.png- 交互過(guò)程:
json交互過(guò)程.png
2.4.2 子類HttpResponseRedirect
也是繼承自Response蒜田,定義在django.http模塊稿械,返回的狀態(tài)碼為302。
使用:return HttpResponseRedirect('/')
冲粤,簡(jiǎn)寫為return redirect('/')
美莫。HttpResponseRedirect使用.png
3. cookie和session
3.1 cookie
cookie由服務(wù)器生成页眯,發(fā)送到瀏覽器,以key-value的形式保存在某個(gè)目錄下的文本文件內(nèi)厢呵,下次請(qǐng)求同一網(wǎng)站時(shí)將cookie發(fā)送給服務(wù)器窝撵。
cookie基于域名安全,不同域名的cookie不能互相訪問(wèn)襟铭。
瀏覽器請(qǐng)求某網(wǎng)站時(shí)碌奉,會(huì)將瀏覽器存儲(chǔ)的跟網(wǎng)站相關(guān)的所有cookie信息提交給服務(wù)器。
- django中使用cookie
- 設(shè)置cookie:創(chuàng)建HttpResponse對(duì)象寒砖,使用對(duì)象的
set_cookie('key', 'value')
方法設(shè)置cookie赐劣;- 獲取cookie:使用request的COOKIES屬性(標(biāo)準(zhǔn)字典)獲取cookie;
獲取和設(shè)置cookie視圖.png設(shè)置cookie前訪問(wèn)設(shè)置cookie.png設(shè)置cookie后獲取cookie.png
3.2 session
cookie是將數(shù)據(jù)存至瀏覽器哩都,而且還得時(shí)瀏覽器打開cookie使用時(shí)魁兼。對(duì)于一些重要狀態(tài)數(shù)據(jù),保存至瀏覽器并不安全漠嵌,這個(gè)時(shí)候就需要使用session咐汞。
session使用也要瀏覽器支持cookie,服務(wù)器將數(shù)據(jù)存儲(chǔ)起來(lái)后儒鹿,會(huì)有唯一對(duì)應(yīng)的id碉考,該id一般作為返回給瀏覽器的cookie中'sessionid'
的值。
- django默認(rèn)開啟session挺身,在
settings.py
中MIDDLE_WARE CLASSES
中通過(guò)中間件開啟侯谁。如果禁用,則將session中間件刪除即可:默認(rèn)通過(guò)中間件開啟session.png- session存儲(chǔ)方式:
- 存儲(chǔ)在數(shù)據(jù)庫(kù)中章钾,如下設(shè)置可以不寫墙贱,默認(rèn)就是存在數(shù)據(jù)庫(kù)中:
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
- 存儲(chǔ)在緩存中,在本機(jī)內(nèi)存中贱傀,讀寫更快但關(guān)閉后無(wú)法找回:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
- 混合存儲(chǔ):優(yōu)先從本機(jī)內(nèi)存存取惨撇,如果沒(méi)有則訪問(wèn)數(shù)據(jù)庫(kù):
SESSION_ENGINE = 'django.contrib.sessions.cached_db'
- 以數(shù)據(jù)庫(kù)方式存儲(chǔ),需要在應(yīng)用中添加Session應(yīng)用(默認(rèn)已有):
包含session應(yīng)用.png遷移生成的session表.pngsession表結(jié)構(gòu).png
- session_key:sessionid府寒;
- session_data:設(shè)置的session數(shù)據(jù)經(jīng)過(guò)base64編碼后的內(nèi)容魁衙;
- expire_date:過(guò)期時(shí)間;
- session方法:通過(guò)request的session屬性就行session讀寫株搔。
- 以鍵值對(duì)的形式保存session:
request.session['key'] = value
- 根據(jù)鍵讀取值:
request.session.get('key', 'default')
- 清除session剖淀,在存儲(chǔ)中刪除值部分:
request.session.clear()
- 清除session,在存儲(chǔ)中刪除整條session記錄:
request.session.flush()
- 刪除指定鍵值:
del request.session['key']
- 設(shè)置會(huì)話過(guò)期時(shí)間纤房,如果不設(shè)置則兩周后過(guò)期:
request.session.set_expiry(value)
- value是整數(shù)纵隔,則在value秒沒(méi)有活動(dòng)后過(guò)期;
- value是0則用戶會(huì)話的Cookie將在瀏覽器關(guān)閉時(shí)過(guò)期;
- value是None則永不會(huì)過(guò)期捌刮;
- session示例
- 查詢數(shù)據(jù)庫(kù)發(fā)現(xiàn)有一條session記錄(應(yīng)該是之前測(cè)試什么添加的):
數(shù)據(jù)庫(kù)有一條session記錄.png- 解析發(fā)現(xiàn)里面值為空:
解析session值.png- 測(cè)試del方法:
刪除session視圖.png- 第一次調(diào)用:
del方法刪除session.png
del方法刪除的是session中的鍵碰煌,所以使用不對(duì)。
- 測(cè)試session.flush()方法:
flush視圖.png
flush刪除成功.png- 此時(shí)查看session值:
獲取session視圖.png沒(méi)有設(shè)置session.png- 設(shè)置session绅作,先調(diào)用set_session:
定義兩個(gè)設(shè)置session方法.pngset_session響應(yīng).png- 查看數(shù)據(jù)庫(kù):
Snip20190706_137.png可以看出數(shù)據(jù)庫(kù)的expire_date和響應(yīng)的cookie有效時(shí)間一致芦圾,默認(rèn)2周。
- 解碼查看session值:
解析查看session值.png- 調(diào)用set_session2設(shè)置:
第二次設(shè)置session響應(yīng).png- 再次查看數(shù)據(jù)庫(kù):
Snip20190706_140.png可以看出有效期和值都變了
- 解碼查看值:
Snip20190706_141.png- 調(diào)用get_session方法:
還是未設(shè)置cookie.pngsession.get()方法也用錯(cuò)俄认。
- 修改get視圖:
Snip20190706_145.png- 重新調(diào)用:
Snip20190706_146.png- 調(diào)整del方法:
調(diào)整del_session視圖.png- 重新調(diào)用:
Snip20190706_148.png- 查詢數(shù)據(jù)庫(kù):
刪除session后.png- 解析數(shù)據(jù):
刪除session后.png可以看出每次更新session值堕扶,過(guò)期時(shí)間都要更新至默認(rèn)兩周后。
- 設(shè)置過(guò)期時(shí)間:
設(shè)置過(guò)期時(shí)間后查詢數(shù)據(jù)庫(kù).png- 調(diào)用后:
設(shè)置過(guò)期時(shí)間成功.png- 查詢數(shù)據(jù)庫(kù):
設(shè)置過(guò)期時(shí)間后數(shù)據(jù)庫(kù).png- 再次調(diào)用get:
超時(shí)后查詢session.png- 再次調(diào)用set:
再次設(shè)置session.png- 查詢數(shù)據(jù)庫(kù):
查詢數(shù)據(jù)庫(kù).png- 通過(guò)cookie設(shè)置過(guò)期:
修改cookie過(guò)期視圖.png- 調(diào)用后查詢數(shù)據(jù)庫(kù):
修改cookie后查詢數(shù)據(jù)庫(kù).png- 等待過(guò)期后調(diào)用get:
cookie過(guò)期后查看.png可以看出梭依,通過(guò)session設(shè)置過(guò)期時(shí)間和通過(guò)cookie設(shè)置過(guò)期處理方式不同。
- cookie:通過(guò)cookie設(shè)置是修改了瀏覽器cookie的過(guò)期時(shí)間典尾,數(shù)據(jù)庫(kù)中session還在而且過(guò)期時(shí)間不變(可能成為死數(shù)據(jù))役拴;
- session:通過(guò)session設(shè)置不僅修改數(shù)據(jù)庫(kù)的session過(guò)期值,而且會(huì)把瀏覽器的cookie過(guò)期也同時(shí)修改钾埂。
- 測(cè)試clear河闰,先調(diào)用set后查詢數(shù)據(jù)庫(kù):
設(shè)置cookie.png- 調(diào)用get:
get_session.png- 調(diào)用clear后:
調(diào)用clear結(jié)果.png- 查詢數(shù)據(jù)庫(kù):
clear后查詢數(shù)據(jù)庫(kù).png- 解析:
Snip20190706_166.png- 使用redis存儲(chǔ)session:
- 安裝依賴包:
pip install django-redis-sessions==0.5.6
- settings.py增加如下配置:
redis配置.png
- 調(diào)用set_session方法:
修改redis所在服務(wù)器redis配置文件,修改protected-mode為no:設(shè)置session.png再次訪問(wèn):修改配置文件.png再次修改配置文件褥紫,注釋掉綁定本地:拒絕連接.png修改配置.png設(shè)置成功.png
- 查詢數(shù)據(jù)庫(kù):
Snip20190709_176.png