Django Cookie于Session
一.Cookie與Session由來(lái)
因?yàn)镠ttp協(xié)議的特性,每一次來(lái)自用戶(hù)瀏覽器的請(qǐng)求都是無(wú)狀態(tài)且獨(dú)立的,通俗地說(shuō),就是無(wú)法保存用戶(hù)狀態(tài),后臺(tái)服務(wù)器根本就不知道當(dāng)前請(qǐng)求和以前及以后請(qǐng)求是否來(lái)自同一用戶(hù),對(duì)于靜態(tài)網(wǎng)站,這可能不是一個(gè)問(wèn)題,但是對(duì)于動(dòng)態(tài)網(wǎng)站來(lái)說(shuō),無(wú)法識(shí)別用戶(hù)并保存用戶(hù)狀態(tài)是致命的,根本就無(wú)法提供服務(wù)。
為了保持鏈接狀態(tài),網(wǎng)站會(huì)通過(guò)用戶(hù)的瀏覽器在用戶(hù)機(jī)器內(nèi)被限定的硬盤(pán)位置中寫(xiě)入一些數(shù)據(jù),也就是所謂的Cookie.通過(guò)Cookie可以保存一些諸如用戶(hù)名、瀏覽記錄、表單記錄等各種數(shù)據(jù)。但是這種方式非常不安全,因?yàn)镃ookie保存在用戶(hù)的機(jī)器上,如果Cookie被偽造、篡改或刪除,就會(huì)造成極大的安全威脅,因此,當(dāng)下網(wǎng)站設(shè)計(jì)通常將Cookie用來(lái)保存一些不重要的內(nèi)容,實(shí)際的用戶(hù)數(shù)據(jù)和狀態(tài)還是以Session會(huì)話(huà)的方式保存在服務(wù)器。
Session就是在服務(wù)器端的Cookie,將用戶(hù)數(shù)據(jù)保存在服務(wù)端,遠(yuǎn)比保存在用戶(hù)端要安全方便和快捷得多。Session是依賴(lài)于Cookie的,但與Cookie的不同之處就是Session將所有的數(shù)據(jù)都放在服務(wù)端,用戶(hù)瀏覽器的Cookie中只會(huì)保存一個(gè)非明文的識(shí)別信息。
Session是大多數(shù)網(wǎng)站都需要具備的功能。Django為我們提供了一個(gè)通用的Session框架,并且可以使用多種session數(shù)據(jù)的保存方式,通常情況,沒(méi)有特別需求的話(huà),都會(huì)使用保存在數(shù)據(jù)庫(kù)內(nèi)的方式.
Django的session框架支持匿名會(huì)話(huà),封裝了cookie的發(fā)送和接收過(guò)程,cookie包含一個(gè)會(huì)話(huà)ID而不是數(shù)據(jù)本身.Django的會(huì)話(huà)框架完全地唯一地基于Cookie。
二.Cookie的使用
1.cookie原理
其實(shí)Cookie是key-value結(jié)構(gòu),類(lèi)似一個(gè)python中的字典,隨著服務(wù)端的響應(yīng)發(fā)送給客戶(hù)端瀏覽器,然后客戶(hù)端瀏覽器會(huì)把Cookie保存起來(lái),當(dāng)下一次再訪(fǎng)問(wèn)服務(wù)器把Cookie再發(fā)送給服務(wù)端。 工作原理:由服務(wù)器產(chǎn)生內(nèi)容,瀏覽器收到請(qǐng)求后保存在本地;當(dāng)瀏覽器再次訪(fǎng)問(wèn)時(shí),瀏覽器會(huì)自動(dòng)帶上Cookie,這樣服務(wù)器就能通過(guò)Cookie的內(nèi)容來(lái)判斷.2.Cookie規(guī)范
1.Cookie大小上限為4KB 2.一個(gè)服務(wù)器最多再客戶(hù)端瀏覽器上保存20個(gè)Cookie 3.一個(gè)瀏覽器最多保存300個(gè)Cookie 這些數(shù)據(jù)知識(shí)HTTP的Cookie規(guī)范,在瀏覽器發(fā)展迅速的今天,一些瀏覽器可能對(duì)Cookie規(guī)范擴(kuò)展了一些。3.Django中操作Cookie
設(shè)置Cookie
rep = HttpResponse(...) rep = render(request,...)rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='',...)參數(shù): 1.key,鍵 2.value,值 3.max_age=None超時(shí)時(shí)間,Cookie需要延續(xù)的時(shí)間(以秒為單位),如果參數(shù)時(shí)\None,這個(gè)Cookie會(huì)延續(xù)到瀏覽器關(guān)閉為止 4.expires=None,超時(shí)時(shí)間,傳一個(gè)datatime對(duì)象 5.path='/',Cookie生效的路徑,/表示根路徑,設(shè)置path='/index/',那么只有訪(fǎng)問(wèn)index的時(shí)候,才會(huì)攜帶cookie 6.domin=None,Cookie生效的域名. 7.secure=False,瀏覽器將通過(guò)HTTPS來(lái)回傳Cookie 8.httponly=False,只能HTTP協(xié)議傳輸,無(wú)法被JavaScript獲取獲取Cookie
request.COOKIES('key') request.get_signed_cookie(key,default=RAISE_ERROR,salt='',max_age=None)參數(shù): 1.default:默認(rèn)值 2.salt:加密鹽 3.max_age:后臺(tái)控制過(guò)期時(shí)間刪除Cookie
rep = HttpResponse('abc') rep.delete_cookie('user')三.Session的使用
session工作流程
1.生成隨機(jī)字符串 2.存儲(chǔ)數(shù)據(jù)庫(kù) 3.寫(xiě)入cookie注意:session必須跟cookie連用Session操作
# 獲取、設(shè)置、刪除Session中數(shù)據(jù) request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在則不設(shè)置 del request.session['k1']# 所有 鍵、值、鍵值對(duì) request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems()# 會(huì)話(huà)session的key request.session.session_key# 將所有Session失效日期小于當(dāng)前日期的數(shù)據(jù)刪除 request.session.clear_expired()# 檢查會(huì)話(huà)session的key在數(shù)據(jù)庫(kù)中是否存在 request.session.exists("session_key")# 刪除當(dāng)前會(huì)話(huà)的所有Session數(shù)據(jù)(只刪數(shù)據(jù)庫(kù)) request.session.delete()# 刪除當(dāng)前的會(huì)話(huà)數(shù)據(jù)并刪除會(huì)話(huà)的Cookie(數(shù)據(jù)庫(kù)和cookie都刪)。 request.session.flush() 這用于確保前面的會(huì)話(huà)數(shù)據(jù)不可以再次被用戶(hù)的瀏覽器訪(fǎng)問(wèn)例如,django.contrib.auth.logout() 函數(shù)中就會(huì)調(diào)用它。# 設(shè)置會(huì)話(huà)Session和Cookie的超時(shí)時(shí)間 request.session.set_expiry(value)* 如果value是個(gè)整數(shù),session會(huì)在對(duì)應(yīng)秒數(shù)后失效。* 如果value是個(gè)datatime或timedelta,session就會(huì)在這個(gè)時(shí)間后失效。* 如果value是0,用戶(hù)關(guān)閉瀏覽器session就會(huì)失效。* 如果value是None,session會(huì)依賴(lài)全局session失效策略。四.Django中Session配置
1. 數(shù)據(jù)庫(kù)Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認(rèn))2. 緩存Session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認(rèn)內(nèi)存緩存,也可以是memcache),此處別名依賴(lài)緩存的設(shè)置3. 文件Session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個(gè)臨時(shí)地址tempfile.gettempdir() 4. 緩存+數(shù)據(jù)庫(kù) SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎其他公用設(shè)置項(xiàng): SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串(默認(rèn)) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認(rèn)) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認(rèn)) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認(rèn)) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認(rèn)) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認(rèn)) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過(guò)期(默認(rèn)) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存(默認(rèn))轉(zhuǎn)載于:https://www.cnblogs.com/louyefeng/p/10001788.html
總結(jié)
以上是生活随笔為你收集整理的Django Cookie于Session的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java servlet 实现的简易购物
- 下一篇: Linux就业技术指导(一):简历撰写及