6.1 django cookie和session

cookie和session

  1. cookie:在網(wǎng)站中,http請(qǐng)求是無(wú)狀態(tài)的。也就是說(shuō)即使第一次和服務(wù)器連接后并且登錄成功后泉褐,第二次請(qǐng)求服務(wù)器依然不能知道當(dāng)前請(qǐng)求是哪個(gè)用戶(hù)礼搁。cookie的出現(xiàn)就是為了解決這個(gè)問(wèn)題,第一次登錄后服務(wù)器返回一些數(shù)據(jù)(cookie)給瀏覽器,然后瀏覽器保存在本地,當(dāng)該用戶(hù)發(fā)送第二次請(qǐng)求的時(shí)候,就會(huì)自動(dòng)的把上次請(qǐng)求存儲(chǔ)的cookie數(shù)據(jù)自動(dòng)的攜帶給服務(wù)器炉擅,服務(wù)器通過(guò)瀏覽器攜帶的數(shù)據(jù)就能判斷當(dāng)前用戶(hù)是哪個(gè)了。cookie存儲(chǔ)的數(shù)據(jù)量有限阳惹,不同的瀏覽器有不同的存儲(chǔ)大小谍失,但一般不超過(guò)4KB。因此使用cookie只能存儲(chǔ)一些小量的數(shù)據(jù)莹汤。
  2. session: session和cookie的作用有點(diǎn)類(lèi)似快鱼,都是為了存儲(chǔ)用戶(hù)相關(guān)的信息。不同的是,cookie是存儲(chǔ)在本地瀏覽器抹竹,session是一個(gè)思路线罕、一個(gè)概念、一個(gè)服務(wù)器存儲(chǔ)授權(quán)信息的解決方案窃判,不同的服務(wù)器钞楼,不同的框架,不同的語(yǔ)言有不同的實(shí)現(xiàn)袄琳。雖然實(shí)現(xiàn)不一樣询件,但是他們的目的都是服務(wù)器為了方便存儲(chǔ)數(shù)據(jù)的。session的出現(xiàn)唆樊,是為了解決cookie存儲(chǔ)數(shù)據(jù)不安全的問(wèn)題的宛琅。
  3. cookie和session使用:web開(kāi)發(fā)發(fā)展至今,cookiesession的使用已經(jīng)出現(xiàn)了一些非常成熟的方案逗旁。在如今的市場(chǎng)或者企業(yè)里嘿辟,一般有兩種存儲(chǔ)方式:
    • 存儲(chǔ)在服務(wù)端:通過(guò)cookie存儲(chǔ)一個(gè)sessionid,然后具體的數(shù)據(jù)則是保存在session中片效。如果用戶(hù)已經(jīng)登錄红伦,則服務(wù)器會(huì)在cookie中保存一個(gè)sessionid,下次再次請(qǐng)求的時(shí)候堤舒,會(huì)把該sessionid攜帶上來(lái)色建,服務(wù)器根據(jù)sessionidsession庫(kù)中獲取用戶(hù)的session數(shù)據(jù)。就能知道該用戶(hù)到底是誰(shuí)舌缤,以及之前保存的一些狀態(tài)信息。這種專(zhuān)業(yè)術(shù)語(yǔ)叫做server side session某残。Djangosession信息默認(rèn)存儲(chǔ)到數(shù)據(jù)庫(kù)中国撵,當(dāng)然也可以存儲(chǔ)到其他地方,比如緩存(如redis)中玻墅,文件系統(tǒng)中等介牙。存儲(chǔ)在服務(wù)器的數(shù)據(jù)會(huì)更加的安全,不容易被竊取澳厢。但存儲(chǔ)在服務(wù)器也有一定的弊端环础,就是會(huì)占用服務(wù)器的資源,但現(xiàn)在服務(wù)器已經(jīng)發(fā)展至今剩拢,一些session信息還是綽綽有余的线得。
    • session數(shù)據(jù)加密,然后存儲(chǔ)在cookie中徐伐。這種專(zhuān)業(yè)術(shù)語(yǔ)叫做client side session贯钩。django框架默認(rèn)采用的就是這種方式,但是也可以替換成其他形式。

在django中操作cookie和session:

操作cookie:

設(shè)置cookie:

設(shè)置cookie是設(shè)置值給瀏覽器的角雷。因此我們需要通過(guò)response的對(duì)象來(lái)設(shè)置祸穷,設(shè)置cookie可以通過(guò)response.set_cookie來(lái)設(shè)置,這個(gè)方法的相關(guān)參數(shù)如下:

  1. key:這個(gè)cookiekey勺三。
  2. value:這個(gè)cookievalue雷滚。
  3. max_age:最長(zhǎng)的生命周期。單位是秒吗坚。
  4. expires:過(guò)期時(shí)間揭措。跟max_age是類(lèi)似的,只不過(guò)這個(gè)參數(shù)需要傳遞一個(gè)具體的日期刻蚯,比如datetime或者是符合日期格式的字符串绊含。如果同時(shí)設(shè)置了expiresmax_age,那么將會(huì)使用expires的值作為過(guò)期時(shí)間炊汹。
  5. path:對(duì)域名下哪個(gè)路徑有效躬充。默認(rèn)是對(duì)域名下所有路徑都有效。
  6. domain:針對(duì)哪個(gè)域名有效讨便。默認(rèn)是針對(duì)主域名下都有效充甚,如果只要針對(duì)某個(gè)子域名才有效,那么可以設(shè)置這個(gè)屬性.
  7. secure:是否是安全的霸褒,如果設(shè)置為True伴找,那么只能在https協(xié)議下才可用。
  8. httponly:默認(rèn)是False废菱。如果為True技矮,那么在客戶(hù)端不能通過(guò)JavaScript進(jìn)行操作。

刪除cookie:

通過(guò)delete_cookie即可刪除cookie殊轴。實(shí)際上刪除cookie就是將指定的cookie的值設(shè)置為空的字符串衰倦,然后使用將他的過(guò)期時(shí)間設(shè)置為0,也就是瀏覽器關(guān)閉后就過(guò)期旁理。

獲取cookie:

獲取瀏覽器發(fā)送過(guò)來(lái)的cookie信息樊零。可以通過(guò)request.COOKIES來(lái)或者孽文。這個(gè)對(duì)象是一個(gè)字典類(lèi)型驻襟。比如獲取所有的cookie,那么示例代碼如下:

cookies = request.COOKIES
for cookie_key,cookie_value in cookies.items():
   print(cookie_key,cookie_value)

操作session:

django中的session默認(rèn)情況下是存儲(chǔ)在服務(wù)器的數(shù)據(jù)庫(kù)中的芋哭,在表中會(huì)根據(jù)sessionid來(lái)提取指定的session數(shù)據(jù)沉衣,然后再把這個(gè)sessionid放到cookie中發(fā)送給瀏覽器存儲(chǔ),瀏覽器下次在向服務(wù)器發(fā)送請(qǐng)求的時(shí)候會(huì)自動(dòng)的把所有cookie信息都發(fā)送給服務(wù)器楷掉,服務(wù)器再?gòu)?code>cookie中獲取sessionid厢蒜,然后再?gòu)臄?shù)據(jù)庫(kù)中獲取session數(shù)據(jù)霞势。但是我們?cè)诓僮?code>session的時(shí)候,這些細(xì)節(jié)壓根就不用管斑鸦。我們只需要通過(guò)request.session即可操作愕贡。示例代碼如下:

def index(request):
   request.session.get('username')
   return HttpResponse('index')

session常用的方法如下:

  1. get:用來(lái)從session中獲取指定值。
  2. pop:從session中刪除一個(gè)值巷屿。
  3. keys:從session中獲取所有的鍵固以。
  4. items:從session中獲取所有的值。
  5. clear:清除當(dāng)前這個(gè)用戶(hù)的session數(shù)據(jù)嘱巾。
  6. flush:刪除session并且刪除在瀏覽器中存儲(chǔ)的session_id憨琳,一般在注銷(xiāo)的時(shí)候用得比較多。
  7. set_expiry(value):設(shè)置過(guò)期時(shí)間旬昭。
    • 整形:代表秒數(shù)篙螟,表示多少秒后過(guò)期。
    • 0:代表只要瀏覽器關(guān)閉问拘,session就會(huì)過(guò)期遍略。
    • None:會(huì)使用全局的session配置。在settings.py中可以設(shè)置SESSION_COOKIE_AGE來(lái)配置全局的過(guò)期時(shí)間骤坐。默認(rèn)是1209600秒绪杏,也就是2周的時(shí)間。
  8. clear_expired:清除過(guò)期的session纽绍。Django并不會(huì)清除過(guò)期的session蕾久,需要定期手動(dòng)的清理,或者是在終端拌夏,使用命令行python manage.py clearsessions來(lái)清除過(guò)期的session僧著。

修改session的存儲(chǔ)機(jī)制:

默認(rèn)情況下,session數(shù)據(jù)是存儲(chǔ)到數(shù)據(jù)庫(kù)中的辖佣。當(dāng)然也可以將session數(shù)據(jù)存儲(chǔ)到其他地方霹抛。可以通過(guò)設(shè)置SESSION_ENGINE來(lái)更改session的存儲(chǔ)位置卷谈,這個(gè)可以配置為以下幾種方案:

  1. django.contrib.sessions.backends.db:使用數(shù)據(jù)庫(kù)。默認(rèn)就是這種方案霞篡。
  2. django.contrib.sessions.backends.file:使用文件來(lái)存儲(chǔ)session世蔗。
  3. django.contrib.sessions.backends.cache:使用緩存來(lái)存儲(chǔ)session。想要將數(shù)據(jù)存儲(chǔ)到緩存中朗兵,前提是你必須要在settings.py中配置好CACHES污淋,并且是需要使用Memcached或者redis,而不能使用純內(nèi)存作為緩存余掖。
  4. django.contrib.sessions.backends.cached_db:在存儲(chǔ)數(shù)據(jù)的時(shí)候寸爆,會(huì)將數(shù)據(jù)先存到緩存中,再存到數(shù)據(jù)庫(kù)中。這樣就可以保證萬(wàn)一緩存系統(tǒng)出現(xiàn)問(wèn)題赁豆,session數(shù)據(jù)也不會(huì)丟失仅醇。在獲取數(shù)據(jù)的時(shí)候,會(huì)先從緩存中獲取魔种,如果緩存中沒(méi)有析二,那么就會(huì)從數(shù)據(jù)庫(kù)中獲取。
  5. django.contrib.sessions.backends.signed_cookies:將session信息加密后存儲(chǔ)到瀏覽器的cookie中节预。這種方式要注意安全叶摄,建議設(shè)置SESSION_COOKIE_HTTPONLY=True,那么在瀏覽器中不能通過(guò)js來(lái)操作session數(shù)據(jù)安拟,并且還需要對(duì)settings.py中的SECRET_KEY進(jìn)行保密蛤吓,因?yàn)橐坏﹦e人知道這個(gè)SECRET_KEY,那么就可以進(jìn)行解密糠赦。另外還有就是在cookie中会傲,存儲(chǔ)的數(shù)據(jù)不能超過(guò)4k
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愉棱,一起剝皮案震驚了整個(gè)濱河市唆铐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奔滑,老刑警劉巖艾岂,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異朋其,居然都是意外死亡王浴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)梅猿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)氓辣,“玉大人,你說(shuō)我怎么就攤上這事袱蚓〕ィ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵喇潘,是天一觀的道長(zhǎng)体斩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)颖低,這世上最難降的妖魔是什么絮吵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮忱屑,結(jié)果婚禮上蹬敲,老公的妹妹穿的比我還像新娘暇昂。我一直安慰自己,他們只是感情好伴嗡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布急波。 她就那樣靜靜地躺著,像睡著了一般闹究。 火紅的嫁衣襯著肌膚如雪幔崖。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天渣淤,我揣著相機(jī)與錄音赏寇,去河邊找鬼。 笑死价认,一個(gè)胖子當(dāng)著我的面吹牛嗅定,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播用踩,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼渠退,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了脐彩?” 一聲冷哼從身側(cè)響起碎乃,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惠奸,沒(méi)想到半個(gè)月后梅誓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佛南,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年梗掰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅回。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡及穗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绵载,到底是詐尸還是另有隱情埂陆,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布娃豹,位于F島的核電站猜惋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏培愁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一缓窜、第九天 我趴在偏房一處隱蔽的房頂上張望定续。 院中可真熱鬧谍咆,春花似錦、人聲如沸私股。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倡鲸。三九已至供嚎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間峭状,已是汗流浹背克滴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留优床,地道東北人劝赔。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像胆敞,于是被迫代替她去往敵國(guó)和親着帽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 一 什么時(shí)候會(huì)出現(xiàn)這樣的情況? 對(duì)自己不滿(mǎn)意的時(shí)候 沒(méi)達(dá)到自己設(shè)定標(biāo)準(zhǔn)的時(shí)候 沒(méi)有人帶領(lǐng)的時(shí)候(其實(shí)有人帶也不好好...
    絢麗風(fēng)景閱讀 299評(píng)論 0 0
  • 環(huán)境 Linux移层;Android studio 3.0 出現(xiàn)這個(gè)問(wèn)題我猜應(yīng)該是我用命令行安裝Android的原因仍翰。...
    北國(guó)雪WRG閱讀 4,430評(píng)論 0 1
  • “如果驕傲沒(méi)被現(xiàn)實(shí)大海冷冷拍下” “又怎會(huì)懂的要多努力” “才走得到遠(yuǎn)方” “……………” 合唱臺(tái)上,整齊靚麗的同...
    熙海閱讀 327評(píng)論 0 2