Django框架5-cookie和session

為什么會有cookie和session?

天全網(wǎng)站建設公司成都創(chuàng)新互聯(lián)公司,天全網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為天全上千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設要多少錢,請找那個售后服務好的天全做網(wǎng)站的公司定做!

????瀏覽器向服務器發(fā)送http請求,建立session(會話),服務器返回完成,session結(jié)束,瀏覽器與服務斷開

????再次發(fā)送http請求,重新建立會話,這就會出現(xiàn)用戶信息丟失,服務器不能對請求的信息進行區(qū)分。

????A登陸帳戶,服務器驗證后,結(jié)束連接,A登陸的信息兩邊都沒有記錄,A再點其它連接,服務器就不知道是誰點的。。。

?

cookie和session是什么?

????為了跟蹤用戶和服務器之間的連接狀態(tài),先出現(xiàn)了cookie(存在客戶端),后來發(fā)現(xiàn)不太安全,又出現(xiàn)了session(存在)

????Cookie通過在客戶端記錄信息確定用戶身份,Session通過在服務器端記錄信息確定用戶身份。

?

一、cookie

????※cookie信息以鍵值對的形式記錄在客戶端

????※可以被修改

????※瀏覽器提交請求自動附加cookie信息

????※最大支持4096字節(jié)

????※不可以跨域共享,比如京東不會識別到已登陸淘寶的用戶信息

?

????1、設置cookie

????????普通設置:set_cookie

????????格式:set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False)

????????注意:set_cookie是HttpResponse方法,所以只能用于redirect和HttpResponse,render沒有此方法

?????????帶加密的:set_signed_cookie,使用salt字符串進行簽名認證,不僅檢測cookie值,還檢測salt生成的簽名字符串

set_signed_cookie(key, value='', salt,max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False)

????????選項功能:

參數(shù)作用
name該Cookie的名稱。Cookie一旦創(chuàng)建,名稱便不可更改
value該Cookie的值。如果值為Unicode字符,需要為字符編碼。如果值為二進制數(shù)據(jù),則需要使用BASE64編碼
maxAge該Cookie失效的時間,單位秒。如果為正數(shù),則該Cookie在maxAge秒之后失效。如果為負數(shù),該Cookie為臨時Cookie,關(guān)閉瀏覽器即失效,瀏覽器也不會以任何形式保存該Cookie。如果為0,表示刪除該Cookie。默認為–1,常用max_age = 60*60*24(一天)
expires

1、可以為秒,expires

2、可以為datetime時間格式

3、datime格式的字符串--源碼里直接使用self.cookie[value]['expires']=str來設置,

????? 但是,并不生效,待探討

需要注意的是服務器和客戶端時間不同步問題

secure該Cookie是否僅被使用安全協(xié)議傳輸。安全協(xié)議。安全協(xié)議有HTTPS,SSL等,在網(wǎng)絡上傳輸數(shù)據(jù)之前先將數(shù)據(jù)加密。默認為false。當使用https式,必須要secure設置為Y=True。
path該Cookie的使用路徑。如果設置為“/sessionWeb/”,則只有contextPath為“/sessionWeb”的程序可以訪問該Cookie。如果設置為“/”,則本域名下contextPath都可以訪問該Cookie。注意最后一個字符必須為“/”
domain可以訪問該Cookie的域名。如果設置為“.google.com”,則所有以“google.com”結(jié)尾的域名都可以訪問該Cookie。注意第一個字符必須為“.”
httponly限制在瀏覽器控制臺獲取鍵值對,但無法對抓包工具進行限制。
salt參數(shù)是字符串,加密cookie,客戶端顯示的是無序的cookie值。僅在set_signed_cookie下有效
#?django?views.py

def?login(request):
????user?=?request.GET.get('user',None)????#?獲取值,如果沒有,賦值None
????pw?=?request.GET.get('pw',None)

????if?user=='david'?and?pw=='123456':
????????res?=?redirecte('index/')?
????????res.set_cookie('username',user)????
????????#?基于httpresponse類設置cookie
????????
????????res.set_signed_cookie('pw','123456',salt="lakjsdfh")?
????????#?使用salt生成簽名,服務端使用get_signed_cookie獲取,使用相同的salt進行簽名認證
????????
????else:
????????res?=?redirecte('/djhw/')??????????#?用戶名和密碼不對則返回主頁
????
????return?res

?

????2、讀取cookie

????????????request.COOKIE.get():讀取普通的cookie

????????????request.get_signed_cookie(),讀取帶簽名的cookie,注意:要想設置默認值,寫default=‘’

def?index(request):
????user?=?request.COOKIE.get('user',None)????#?獲取cookie,如果沒有,賦值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是否和之前設置的一樣
????????return?render(request,?'hw/index.html')????#?如果一樣,進入index頁面
????else:
????????return?redirect('/djhw/')??????????????????#?如果不一樣,進入登陸面頁

?

?????3、刪除cookie,delete_cookie()

res?=?redirect('/djhw/')
res.delete_cookie('user_name')

?

????4、使用裝飾器認證

#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/')??????????????????#?如果不存在,返回首頁(登陸頁)
????return?inner???????????????????????????????????????#?返回結(jié)果
????
????
#CBV
import?django.utils.decorators?import?method_decorator
form?django?import?views

方法一:使用類裝飾器
@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):
????#?因為所有方法都是dispatch方法注冊的,只裝飾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信息以鍵值對的形式記錄在服務端,存儲位置可以在數(shù)據(jù)庫、內(nèi)存、文件

????※服務端給用戶所回一個隨機字符串,客戶端在Cookies中存儲這個隨機串

????※客戶端下次提交包含隨機字符串,通過隨機字符串獲取session


????1、設置Session鍵值

????????session是基于request的方法

def?login(request):
????#?設置和讀取session鍵值
????request.session['key1']='value1'??????????????#?增加key1,如果鍵存在,更新值
????request.session.setdefault('key2',?'value2')??#?增加key2,如果存在,不設置value2
????request.session.get('key3','value3')????#?key3存在,獲??;不存在,增加key3,值為'value'
????request.session['key1']?????????????????#?獲取Key1的值,如果不存在報錯
????
????#?查詢是否存在session?ID
????request.session.exists('session?id')????#?可用于數(shù)據(jù)庫+緩存方式,緩存沒有找數(shù)據(jù)庫
????
????#?設置session生效時間
????request.session.set_expiry(value)????#?設置生效時長,value單位秒
????????#?如果value是個整數(shù),session會在多少些秒后失效
????????#?如果value是個datetime或timedelta,session就會在這個時間后失效
????????#?如果value是0,用戶關(guān)閉瀏覽器session就會失效
????????#?如果value是None,session會依賴全局session失效策略
????????
????request.session.clear_expired()????????#?datetime日期,把生效日期小于當前日期的session刪除
????????
????
????#?刪除
????del?request.session['key1']????#?刪除session鍵
????request.session.clear()????????#?刪除所有session鍵,session?ID保留?
????request.session.delete()???????#?刪除當前session?ID,參數(shù)可以放session?ID,用戶logout時用
????
????#?查看session
????request.session.items()????????#?把鍵值對以列表顯示[(k1,v1),(k2,v2)]
????request.session.keys()?????????#?顯示所有keys,[k1,k2]
????request.session.values()???????#?顯示所有values,[v1,v2]

????#?查看當前請求的session_id
????request.session.session_key????#?存儲在cookies的加密session?ID

????2、session的全局配置:

????????在settings.py文件中可以對session進行全局配置

SESSION_COOKIE_NAME?=?"sessionid"???????#?Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
SESSION_COOKIE_PATH?=?"/"???????????????#?Session的cookie保存的路徑(默認)
SESSION_COOKIE_DOMAIN?=?None?????????????#?Session的cookie保存的域名(默認)
SESSION_COOKIE_SECURE?=?False????????????#?是否Https傳輸cookie(默認)
SESSION_COOKIE_HTTPONLY?=?True???????????#?是否Session的cookie只支持http傳輸(默認)
SESSION_COOKIE_AGE?=?1209600?????????????#?Session的cookie失效日期(2周)(默認)
SESSION_EXPIRE_AT_BROWSER_CLOSE?=?False??#?是否關(guān)閉瀏覽器使得Session過期(默認)
SESSION_SAVE_EVERY_REQUEST?=?False???????#?是否每次請求都保存Session,默認修改之后才保存(默認)

????3、session的存儲位置

????????在settings.py文件中配置引擎,可以輕松改變session的存儲位置

SESSION_ENGINE?=?'django.contrib.sessions.backends.db'????????????????????#?數(shù)據(jù)庫(默認)
SESSION_ENGINE?=?'django.contrib.sessions.backends.file'??????????????????#?文件
SESSION_ENGINE?=?'django.contrib.sessions.backends.cache'?????????????????#?緩存
SESSION_ENGINE?=?'django.contrib.sessions.backends.cached_db'?????????????#?緩存數(shù)據(jù)庫
SESSION_ENGINE?=?'django.contrib.sessions.backends.signed_cookies'????????#?加密cookie

?

????4、session保存在緩存(內(nèi)存、memcache、redis)

????????settings.py配置:

SESSION_ENGINE?=?'django.contrib.sessions.babckends.cache'????#?設置引擎(緩存)
SESSION_ENGINE?=?'django.contrib.sessions.babckends.cache_db'????
#?設置引擎(緩存+數(shù)據(jù)庫),緩存找不到,去數(shù)據(jù)庫找

SESSION_CACHE_ALIAS?=?'default'????????????#?指定CACHES里面的配置項名
#?CACHES里面可以有多項,但只有一個生效
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、存儲到文件

????????settings.py

SESSION_ENGINE?=?'django.contrib.sessions.backends.file'
SESSION_FILE_PATH?=?None?????????????#?緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile
#?SESSION_FILE_PATH?=?os.path.join(BASE_DIR,?'cache')
SESSION_CACHE_ALIAS?=?'default'????????????#?指定CACHES里面的配置項名
CACHES?=?{
????'default':?{
????????'BACKEND':?'django.core.cache.backends.filebased.FileBasedCache',
????????'LOCATION':?'/var/tmp/django_cache',
????}
}

?

?

?

?

網(wǎng)站名稱:Django框架5-cookie和session
文章起源:http://bm7419.com/article4/iihdoe.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供服務器托管網(wǎng)站營銷、定制開發(fā)、用戶體驗靜態(tài)網(wǎng)站、網(wǎng)站設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)