django學(xué)習(xí)筆記(三)—— V層相關(guān)學(xué)習(xí)

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中定義墓猎,有兩種用法:
      1. url(r'^', include('booktest.urls')) # 包含應(yīng)用中urls
      1. 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)搀军,有兩種使用方式:
      1. 位置參數(shù):按位置依次在視圖內(nèi)接收小括號(hào)中的值;
      1. 關(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ō)明屯远,否則屬性都是只讀的):
    1. path:完整請(qǐng)求路徑,不包含域名和請(qǐng)求參數(shù)捕虽;
    1. method:請(qǐng)求方法慨丐,常用的有'GET'和'POST';
    1. encoding:提交數(shù)據(jù)的編碼方式泄私,None表示使用瀏覽器默認(rèn)編碼方式房揭,一般為utf8。注意這是一個(gè)可寫屬性晌端,修改后對(duì)屬性的接收使用的是新的編碼方式:
      utf8編碼接收參數(shù).png
      gbk編碼接收參數(shù).png
    1. GET:QueryDict類型對(duì)象捅暴,類似于python字典,包含get方式請(qǐng)求的所有參數(shù)咧纠;
    1. POST:QueryDict類型對(duì)象蓬痒,類似于字典,包含post方式請(qǐng)求的所有參數(shù)漆羔;
    1. FILES:類似于字典的對(duì)象,包含上傳的所有文件贞谓;
    1. COOKIES:標(biāo)準(zhǔn)的python字典,包含所有cookies,鍵和值都是字符串赁遗;
    1. 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ì)象需要用戶自定義尚氛。

  • 屬性:
    1. content:返回的內(nèi)容
    1. charset:response采用的編碼字符集,默認(rèn)為utf-8洞渤;
    1. status_code:響應(yīng)碼阅嘶;
  • 方法:
    1. 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ò)期魂迄。
    1. del_cookie(key):如果key不存在則不作任何處理;
    1. 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.pyMIDDLE_WARE CLASSES中通過(guò)中間件開啟侯谁。如果禁用,則將session中間件刪除即可:
    默認(rèn)通過(guò)中間件開啟session.png
  • session存儲(chǔ)方式:
      1. 存儲(chǔ)在數(shù)據(jù)庫(kù)中章钾,如下設(shè)置可以不寫墙贱,默認(rèn)就是存在數(shù)據(jù)庫(kù)中:
        SESSION_ENGINE = 'django.contrib.sessions.backends.db'
      1. 存儲(chǔ)在緩存中,在本機(jī)內(nèi)存中贱傀,讀寫更快但關(guān)閉后無(wú)法找回:
        SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
      1. 混合存儲(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表.png
    session表結(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讀寫株搔。
      1. 以鍵值對(duì)的形式保存session:
        request.session['key'] = value
      1. 根據(jù)鍵讀取值:
        request.session.get('key', 'default')
      1. 清除session剖淀,在存儲(chǔ)中刪除值部分:
        request.session.clear()
      1. 清除session,在存儲(chǔ)中刪除整條session記錄:
        request.session.flush()
      1. 刪除指定鍵值:
        del request.session['key']
      1. 設(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方法.png
      set_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.png

      session.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:
      1. 安裝依賴包:pip install django-redis-sessions==0.5.6
      1. settings.py增加如下配置:
        redis配置.png
      1. 調(diào)用set_session方法:
        設(shè)置session.png

        修改redis所在服務(wù)器redis配置文件,修改protected-mode為no:
        修改配置文件.png
        再次訪問(wèn):
        拒絕連接.png
        再次修改配置文件褥紫,注釋掉綁定本地:
        修改配置.png
        設(shè)置成功.png
      1. 查詢數(shù)據(jù)庫(kù):
        Snip20190709_176.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姜性,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子髓考,更是在濱河造成了極大的恐慌部念,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氨菇,死亡現(xiàn)場(chǎng)離奇詭異儡炼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)查蓉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門乌询,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人豌研,你說(shuō)我怎么就攤上這事妹田。” “怎么了鹃共?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵鬼佣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我霜浴,道長(zhǎng)沮趣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任坷随,我火速辦了婚禮房铭,結(jié)果婚禮上驻龟,老公的妹妹穿的比我還像新娘。我一直安慰自己缸匪,他們只是感情好翁狐,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凌蔬,像睡著了一般露懒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砂心,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天懈词,我揣著相機(jī)與錄音,去河邊找鬼辩诞。 笑死坎弯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的译暂。 我是一名探鬼主播抠忘,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼外永!你這毒婦竟也來(lái)了崎脉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伯顶,失蹤者是張志新(化名)和其女友劉穎囚灼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祭衩,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啦撮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汪厨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赃春。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖劫乱,靈堂內(nèi)的尸體忽然破棺而出织中,到底是詐尸還是另有隱情,我是刑警寧澤衷戈,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布狭吼,位于F島的核電站,受9級(jí)特大地震影響殖妇,放射性物質(zhì)發(fā)生泄漏刁笙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疲吸。 院中可真熱鬧座每,春花似錦、人聲如沸摘悴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蹂喻。三九已至葱椭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間口四,已是汗流浹背孵运。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔓彩,地道東北人治笨。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像粪小,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抡句,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,113評(píng)論 1 32
  • 會(huì)話(Session)跟蹤是Web程序中常用的技術(shù)探膊,用來(lái)跟蹤用戶的整個(gè)會(huì)話。常用的會(huì)話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,627評(píng)論 1 49
  • 點(diǎn)我查看本文集的說(shuō)明及目錄待榔。 本項(xiàng)目相關(guān)內(nèi)容包括: 實(shí)現(xiàn)過(guò)程: CH7 創(chuàng)建在線商店 CH8 管理支付和訂單 CH...
    學(xué)以致用123閱讀 3,637評(píng)論 0 6
  • 仰望心中的天空逞壁,不要迷失在所有人都看得見的桃花源中,永遠(yuǎn)低頭走路锐锣,抬頭察世
    李亦你好閱讀 174評(píng)論 0 0
  • 在秋意中感受你的歡樂(lè) 驕傲的捧出你的快樂(lè) 生命就像是一朵鮮花 便造就了整個(gè)世界的希望
    Bill1007閱讀 296評(píng)論 0 3