為什么會(huì)有cookie和session?
天全網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,天全網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為天全上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的天全做網(wǎng)站的公司定做!
????瀏覽器向服務(wù)器發(fā)送http請(qǐng)求,建立session(會(huì)話),服務(wù)器返回完成,session結(jié)束,瀏覽器與服務(wù)斷開(kāi)
????再次發(fā)送http請(qǐng)求,重新建立會(huì)話,這就會(huì)出現(xiàn)用戶信息丟失,服務(wù)器不能對(duì)請(qǐng)求的信息進(jìn)行區(qū)分。
????A登陸帳戶,服務(wù)器驗(yàn)證后,結(jié)束連接,A登陸的信息兩邊都沒(méi)有記錄,A再點(diǎn)其它連接,服務(wù)器就不知道是誰(shuí)點(diǎn)的。。。
?
cookie和session是什么?
????為了跟蹤用戶和服務(wù)器之間的連接狀態(tài),先出現(xiàn)了cookie(存在客戶端),后來(lái)發(fā)現(xiàn)不太安全,又出現(xiàn)了session(存在)
????Cookie通過(guò)在客戶端記錄信息確定用戶身份,Session通過(guò)在服務(wù)器端記錄信息確定用戶身份。
?
一、cookie
????※cookie信息以鍵值對(duì)的形式記錄在客戶端
????※可以被修改
????※瀏覽器提交請(qǐng)求自動(dòng)附加cookie信息
????※最大支持4096字節(jié)
????※不可以跨域共享,比如京東不會(huì)識(shí)別到已登陸淘寶的用戶信息
?
????1、設(shè)置cookie
????????普通設(shè)置:set_cookie
????????格式:set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False)
????????注意:set_cookie是HttpResponse方法,所以只能用于redirect和HttpResponse,render沒(méi)有此方法
?????????帶加密的:set_signed_cookie,使用salt字符串進(jìn)行簽名認(rèn)證,不僅檢測(cè)cookie值,還檢測(cè)salt生成的簽名字符串
set_signed_cookie(key, value='', salt,max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False)
????????選項(xiàng)功能:
參數(shù) | 作用 |
name | 該Cookie的名稱(chēng)。Cookie一旦創(chuàng)建,名稱(chēng)便不可更改 |
value | 該Cookie的值。如果值為Unicode字符,需要為字符編碼。如果值為二進(jìn)制數(shù)據(jù),則需要使用BASE64編碼 |
maxAge | 該Cookie失效的時(shí)間,單位秒。如果為正數(shù),則該Cookie在maxAge秒之后失效。如果為負(fù)數(shù),該Cookie為臨時(shí)Cookie,關(guān)閉瀏覽器即失效,瀏覽器也不會(huì)以任何形式保存該Cookie。如果為0,表示刪除該Cookie。默認(rèn)為–1,常用max_age = 60*60*24(一天) |
expires | 1、可以為秒,expires 2、可以為datetime時(shí)間格式 3、datime格式的字符串--源碼里直接使用self.cookie[value]['expires']=str來(lái)設(shè)置, ????? 但是,并不生效,待探討 需要注意的是服務(wù)器和客戶端時(shí)間不同步問(wèn)題 |
secure | 該Cookie是否僅被使用安全協(xié)議傳輸。安全協(xié)議。安全協(xié)議有HTTPS,SSL等,在網(wǎng)絡(luò)上傳輸數(shù)據(jù)之前先將數(shù)據(jù)加密。默認(rèn)為false。當(dāng)使用https式,必須要secure設(shè)置為Y=True。 |
path | 該Cookie的使用路徑。如果設(shè)置為“/sessionWeb/”,則只有contextPath為“/sessionWeb”的程序可以訪問(wèn)該Cookie。如果設(shè)置為“/”,則本域名下contextPath都可以訪問(wèn)該Cookie。注意最后一個(gè)字符必須為“/” |
domain | 可以訪問(wèn)該Cookie的域名。如果設(shè)置為“.google.com”,則所有以“google.com”結(jié)尾的域名都可以訪問(wèn)該Cookie。注意第一個(gè)字符必須為“.” |
httponly | 限制在瀏覽器控制臺(tái)獲取鍵值對(duì),但無(wú)法對(duì)抓包工具進(jìn)行限制。 |
salt | 參數(shù)是字符串,加密cookie,客戶端顯示的是無(wú)序的cookie值。僅在set_signed_cookie下有效 |
#?django?views.py def?login(request): ????user?=?request.GET.get('user',None)????#?獲取值,如果沒(méi)有,賦值None ????pw?=?request.GET.get('pw',None) ????if?user=='david'?and?pw=='123456': ????????res?=?redirecte('index/')? ????????res.set_cookie('username',user)???? ????????#?基于httpresponse類(lèi)設(shè)置cookie ???????? ????????res.set_signed_cookie('pw','123456',salt="lakjsdfh")? ????????#?使用salt生成簽名,服務(wù)端使用get_signed_cookie獲取,使用相同的salt進(jìn)行簽名認(rèn)證 ???????? ????else: ????????res?=?redirecte('/djhw/')??????????#?用戶名和密碼不對(duì)則返回主頁(yè) ???? ????return?res
?
????2、讀取cookie
????????????request.COOKIE.get():讀取普通的cookie
????????????request.get_signed_cookie(),讀取帶簽名的cookie,注意:要想設(shè)置默認(rèn)值,寫(xiě)default=‘’
def?index(request): ????user?=?request.COOKIE.get('user',None)????#?獲取cookie,如果沒(méi)有,賦值None ???? ????pw?=?request.COOKIE.get('pw',None)???????? ????#?獲取到的是:123456:加密的簽名字符串 ???? ????pw?=?request.get_signed_cookie('pw',None,salt)?????? ????#?使用salt,獲取到的是:123456 ???? ????if?user?==?'david'?and?pw?==?'123456':????#?判斷獲取的cookie是否和之前設(shè)置的一樣 ????????return?render(request,?'hw/index.html')????#?如果一樣,進(jìn)入index頁(yè)面 ????else: ????????return?redirect('/djhw/')??????????????????#?如果不一樣,進(jìn)入登陸面頁(yè)
?
?????3、刪除cookie,delete_cookie()
res?=?redirect('/djhw/') res.delete_cookie('user_name')
?
????4、使用裝飾器認(rèn)證
#FBV def?auth(func): ????def?inner(request,?*args,?**kwargs) ????????username?=?request.COOLIES.get('user_name')????#?讀取用戶名 ????????if?username:???????? ????????????return?func(request,?*args,?**kwargs)??????#?如果存在,返回傳入的func函數(shù) ????????else: ????????????return?redirect('/djhw/')??????????????????#?如果不存在,返回首頁(yè)(登陸頁(yè)) ????return?inner???????????????????????????????????????#?返回結(jié)果 ???? ???? #CBV import?django.utils.decorators?import?method_decorator form?django?import?views 方法一:使用類(lèi)裝飾器 @method_decorator(auth,name='dispatch') class?Blog(views.View): ????def?get(self,request): ????????username=request.COOKIES.get('user_name') ????????return?render(request,'hw/index.html') ???????? 方法二: class?Blog(views.View): ????#?因?yàn)樗蟹椒ǘ际莇ispatch方法注冊(cè)的,只裝飾dispatch,所有方法都被裝飾。 ????@auth ????def?dispatch(self,request,*args,**kwargs): ????????return?super(Blog.self).dispatch(request,*args,**kwargs) ????def?get(self,request): ????????username=request.COOKIES.get('user_name') ????????return?render(request,'hw/index.html')
?
二、session
?
????※session信息以鍵值對(duì)的形式記錄在服務(wù)端,存儲(chǔ)位置可以在數(shù)據(jù)庫(kù)、內(nèi)存、文件
????※服務(wù)端給用戶所回一個(gè)隨機(jī)字符串,客戶端在Cookies中存儲(chǔ)這個(gè)隨機(jī)串
????※客戶端下次提交包含隨機(jī)字符串,通過(guò)隨機(jī)字符串獲取session
????1、設(shè)置Session鍵值
????????session是基于request的方法
def?login(request): ????#?設(shè)置和讀取session鍵值 ????request.session['key1']='value1'??????????????#?增加key1,如果鍵存在,更新值 ????request.session.setdefault('key2',?'value2')??#?增加key2,如果存在,不設(shè)置value2 ????request.session.get('key3','value3')????#?key3存在,獲??;不存在,增加key3,值為'value' ????request.session['key1']?????????????????#?獲取Key1的值,如果不存在報(bào)錯(cuò) ???? ????#?查詢是否存在session?ID ????request.session.exists('session?id')????#?可用于數(shù)據(jù)庫(kù)+緩存方式,緩存沒(méi)有找數(shù)據(jù)庫(kù) ???? ????#?設(shè)置session生效時(shí)間 ????request.session.set_expiry(value)????#?設(shè)置生效時(shí)長(zhǎng),value單位秒 ????????#?如果value是個(gè)整數(shù),session會(huì)在多少些秒后失效 ????????#?如果value是個(gè)datetime或timedelta,session就會(huì)在這個(gè)時(shí)間后失效 ????????#?如果value是0,用戶關(guān)閉瀏覽器session就會(huì)失效 ????????#?如果value是None,session會(huì)依賴(lài)全局session失效策略 ???????? ????request.session.clear_expired()????????#?datetime日期,把生效日期小于當(dāng)前日期的session刪除 ???????? ???? ????#?刪除 ????del?request.session['key1']????#?刪除session鍵 ????request.session.clear()????????#?刪除所有session鍵,session?ID保留? ????request.session.delete()???????#?刪除當(dāng)前session?ID,參數(shù)可以放session?ID,用戶logout時(shí)用 ???? ????#?查看session ????request.session.items()????????#?把鍵值對(duì)以列表顯示[(k1,v1),(k2,v2)] ????request.session.keys()?????????#?顯示所有keys,[k1,k2] ????request.session.values()???????#?顯示所有values,[v1,v2] ????#?查看當(dāng)前請(qǐng)求的session_id ????request.session.session_key????#?存儲(chǔ)在cookies的加密session?ID
????2、session的全局配置:
????????在settings.py文件中可以對(duì)session進(jìn)行全局配置
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))
????3、session的存儲(chǔ)位置
????????在settings.py文件中配置引擎,可以輕松改變session的存儲(chǔ)位置
SESSION_ENGINE?=?'django.contrib.sessions.backends.db'????????????????????#?數(shù)據(jù)庫(kù)(默認(rèn)) SESSION_ENGINE?=?'django.contrib.sessions.backends.file'??????????????????#?文件 SESSION_ENGINE?=?'django.contrib.sessions.backends.cache'?????????????????#?緩存 SESSION_ENGINE?=?'django.contrib.sessions.backends.cached_db'?????????????#?緩存數(shù)據(jù)庫(kù) SESSION_ENGINE?=?'django.contrib.sessions.backends.signed_cookies'????????#?加密cookie
?
????4、session保存在緩存(內(nèi)存、memcache、redis)
????????settings.py配置:
SESSION_ENGINE?=?'django.contrib.sessions.babckends.cache'????#?設(shè)置引擎(緩存) SESSION_ENGINE?=?'django.contrib.sessions.babckends.cache_db'???? #?設(shè)置引擎(緩存+數(shù)據(jù)庫(kù)),緩存找不到,去數(shù)據(jù)庫(kù)找 SESSION_CACHE_ALIAS?=?'default'????????????#?指定CACHES里面的配置項(xiàng)名 #?CACHES里面可以有多項(xiàng),但只有一個(gè)生效 CACHES?=?{???? ????'default':{????????#?保存在內(nèi)存 ????????'BACKEND':?'django.core.cache.backends.locmem.LocMemCache', ????????'LOCATION':?'unique-snowflake', ????} ????'memcache':{????????#?保存在內(nèi)存 ????'BACKEND':?'django.core.cache.backends.memcached.PyLibMCCache', ????'LOCATION':?['ip1:port','ip2:port',], ????} ???? ????'redis':{??????????#?保存在redis,django需要pip3?install?django_redis安裝 ????'BACKEND':?'django_redis.cache.RedisCache', ????'LOCATION':?'redis://密碼@IP:PORT/1', ????'OPTIONS':?{'CLIENT_CLASS':'django_redis.client.DefaultClient'}, ????}???? }
?
????5、存儲(chǔ)到文件
????????settings.py
SESSION_ENGINE?=?'django.contrib.sessions.backends.file' SESSION_FILE_PATH?=?None?????????????#?緩存文件路徑,如果為None,則使用tempfile模塊獲取一個(gè)臨時(shí)地址tempfile #?SESSION_FILE_PATH?=?os.path.join(BASE_DIR,?'cache') SESSION_CACHE_ALIAS?=?'default'????????????#?指定CACHES里面的配置項(xiàng)名 CACHES?=?{ ????'default':?{ ????????'BACKEND':?'django.core.cache.backends.filebased.FileBasedCache', ????????'LOCATION':?'/var/tmp/django_cache', ????} }
?
?
?
?
網(wǎng)站名稱(chēng):Django框架5-cookie和session
文章起源:http://aaarwkj.com/article4/iihdoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站營(yíng)銷(xiāo)、定制開(kāi)發(fā)、用戶體驗(yàn)、靜態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)