COOKIE 與 SESSION

Django實(shí)現(xiàn)的COOKIE

1、獲取Cookie

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
    #參數(shù):
        default: 默認(rèn)值
           salt: 加密鹽
        max_age: 后臺(tái)控制過期時(shí)間

2、設(shè)置Cookie

rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect()
 
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密鹽',...) 

參數(shù):

'''

def set_cookie(self, key,                 鍵
             value='',            值
             max_age=None,        超長時(shí)間
             expires=None,        超長時(shí)間
             path='/',           Cookie生效的路徑,
                                         瀏覽器只會(huì)把cookie回傳給帶有該路徑的頁面,這樣可以避免將
                                         cookie傳給站點(diǎn)中的其他的應(yīng)用。
                                         / 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問
             
                     domain=None,         Cookie生效的域名
                                        
                                          你可用這個(gè)參數(shù)來構(gòu)造一個(gè)跨站cookie。
                                          如, domain=".example.com"
                                          所構(gòu)造的cookie對(duì)下面這些站點(diǎn)都是可讀的:
                                          www.example.com 、 www2.example.com 
                         和an.other.sub.domain.example.com 。
                                          如果該參數(shù)設(shè)置為 None ,cookie只能由設(shè)置它的站點(diǎn)讀取。

             secure=False,        如果設(shè)置為 True ,瀏覽器將通過HTTPS來回傳cookie。
             httponly=False       只能http協(xié)議傳輸,無法被JavaScript獲取
                                         (不是絕對(duì),底層抓包可以獲取到也可以被覆蓋)
          ): pass

'''

由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。

<script src='/static/js/jquery.cookie.js'>
 
</script> $.cookie("key", value,{ path: '/' });

3 刪除cookie

response.delete_cookie("cookie_key",path="/",domain=name)

cookie存儲(chǔ)到客戶端
優(yōu)點(diǎn):
數(shù)據(jù)存在在客戶端,減輕服務(wù)器端的壓力,提高網(wǎng)站的性能。
缺點(diǎn):
安全性不高:在客戶端機(jī)很容易被查看或破解用戶會(huì)話信息

Django實(shí)現(xiàn)的SESSION

1、 基本操作

1、設(shè)置Sessions值
          request.session['session_name'] ="admin"
2、獲取Sessions值
          session_name = request.session["session_name"]
3、刪除Sessions值
          del request.session["session_name"]
4、檢測是否操作session值
          if "session_name" is request.session :
5、get(key, default=None)
 
fav_color = request.session.get('fav_color', 'red')
 
6、pop(key)
 
fav_color = request.session.pop('fav_color')
 
7、keys()
 
8、items()
 
9、setdefault()
 
10、flush() 刪除當(dāng)前的會(huì)話數(shù)據(jù)并刪除會(huì)話的Cookie。
            這用于確保前面的會(huì)話數(shù)據(jù)不可以再次被用戶的瀏覽器訪問
            例如,django.contrib.auth.logout() 函數(shù)中就會(huì)調(diào)用它。
 
 
11 用戶session的隨機(jī)字符串
        request.session.session_key
  
        # 將所有Session失效日期小于當(dāng)前日期的數(shù)據(jù)刪除
        request.session.clear_expired()
  
        # 檢查 用戶session的隨機(jī)字符串 在數(shù)據(jù)庫中是否
        request.session.exists("session_key")
  
        # 刪除當(dāng)前用戶的所有Session數(shù)據(jù)
        request.session.delete("session_key")
  
        request.session.set_expiry(value)
            * 如果value是個(gè)整數(shù),session會(huì)在些秒數(shù)后失效。
            * 如果value是個(gè)datatime或timedelta,session就會(huì)在這個(gè)時(shí)間后失效。
            * 如果value是0,用戶關(guān)閉瀏覽器session就會(huì)失效。
            * 如果value是None,session會(huì)依賴全局session失效策略。

2、 流程解析圖

image.png

3、 示例

views:

def log_in(request):

    if request.method=="POST":
        username=request.POST['user']
        password=request.POST['pwd']

        user=UserInfo.objects.filter(username=username,password=password)

        if user:
            #設(shè)置session內(nèi)部的字典內(nèi)容
            request.session['is_login']='true'
            request.session['username']=username

            #登錄成功就將url重定向到后臺(tái)的url
            return redirect('/backend/')

    #登錄不成功或第一訪問就停留在登錄頁面
    return render(request,'login.html')




def backend(request):
    print(request.session,"------cookie")
    print(request.COOKIES,'-------session')
    """
    這里必須用讀取字典的get()方法把is_login的value缺省設(shè)置為False,
    當(dāng)用戶訪問backend這個(gè)url先嘗試獲取這個(gè)瀏覽器對(duì)應(yīng)的session中的
    is_login的值。如果對(duì)方登錄成功的話,在login里就已經(jīng)把is_login
    的值修改為了True,反之這個(gè)值就是False的
    """

    is_login=request.session.get('is_login',False)
    #如果為真,就說明用戶是正常登陸的
    if is_login:
        #獲取字典的內(nèi)容并傳入頁面文件
        cookie_content=request.COOKIES
        session_content=request.session

        username=request.session['username']

        return render(request,'backend.html',locals())
    else:
        """
        如果訪問的時(shí)候沒有攜帶正確的session,
        就直接被重定向url回login頁面
        """
        return redirect('/login/')



def log_out(request):
    """
    直接通過request.session['is_login']回去返回的時(shí)候,
    如果is_login對(duì)應(yīng)的value值不存在會(huì)導(dǎo)致程序異常。所以
    需要做異常處理
    """
    try:
        #刪除is_login對(duì)應(yīng)的value值
        del request.session['is_login']
        
        # OR---->request.session.flush() # 刪除django-session表中的對(duì)應(yīng)一行記錄

    except KeyError:
        pass
    #點(diǎn)擊注銷之后,直接重定向回登錄頁面
    return redirect('/login/')

template:

===================================login.html==================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="/login/" method="post">
    <p>用戶名: <input type="text" name="user"></p>
    <p>密碼: <input type="password" name="pwd"></p>
    <p><input type="submit"></p>
</form>


</body>
</html>


===================================backend.html==================

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h3>hello {{ username }}</h3>
<a href="/logout/">注銷</a>

</body>
</html>

4、session存儲(chǔ)的相關(guān)配置

(1)數(shù)據(jù)庫配置(默認(rèn)):

Django默認(rèn)支持Session,并且默認(rèn)是將Session數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中,即:django_session 表中。
  
a. 配置 settings.py
  
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默認(rè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過期(默認(rèn))
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存(默認(rèn))Django默認(rèn)支持Session,并且默認(rèn)是將Session數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中,即:django_session 表中。
  
a. 配置 settings.py
  
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默認(rè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過期(默認(rèn))
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存(默認(rèn))

(2)緩存配置

a. 配置 settings.py
  
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的緩存別名(默認(rèn)內(nèi)存緩存,也可以是memcache),此處別名依賴緩存的設(shè)置
  
  
    SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串
    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                        # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存

(3)文件配置

a. 配置 settings.py
  
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個(gè)臨時(shí)地址tempfile.gettempdir()        
    SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串
    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                          # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評(píng)論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,034評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,165評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,559評(píng)論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,781評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,327評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,084評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,278評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,495評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評(píng)論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,010評(píng)論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,241評(píng)論 2 375

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

  • **Cookie **是當(dāng)你瀏覽某網(wǎng)站時(shí),網(wǎng)站存儲(chǔ)在你機(jī)器上的一個(gè)小文本文件,它可以記錄你的用戶ID,密碼、瀏覽...
    lmem閱讀 1,047評(píng)論 0 1
  • cookie cookie的起源 早期web剛開始出現(xiàn)復(fù)雜的應(yīng)用程序時(shí),產(chǎn)生了對(duì)于能夠直接在客戶端上存儲(chǔ)用戶信息能...
    zenggo閱讀 3,873評(píng)論 1 52
  • 背景 cookie與session都是為了保持訪問客戶與后端服務(wù)器的交互狀態(tài),有各自的優(yōu)點(diǎn)也有各自的缺點(diǎn)。 coo...
    發(fā)呆的小耳朵閱讀 750評(píng)論 0 1
  • 目錄 一、Cookie與Session 1.1 概念 cookie不屬于http協(xié)議范圍,由于http協(xié)議無法保持...
    CaiGuangyin閱讀 1,756評(píng)論 0 7
  • Cookie與Session詳解讀書筆記,從概念、操作、應(yīng)用、注意事項(xiàng)以及區(qū)別等幾方面詳細(xì)闡述兩者的基礎(chǔ)知識(shí),它們...
    奮斗live閱讀 1,094評(píng)論 0 2