這幾天從新系統學習Django 學到了 session 和 cookie , 第一次學的時候就沒有很明白這兩個概念,今天學的時候感受學明白了,因而就打算記下來。python
首先先講一下cookie, 能夠這麼理解,cookie 的存在致使了session的存在,能夠沒有session,可是不能沒有cookie,可見cookie的重要。mysql
cookie按照我本身的話說,就是瀏覽器給服務器看的一張id,一張身份證,這張ID卡上記載着客戶端的信息,好比說用戶名啥之類的,在客戶端發送請求給到服務器的時候,同時將這張ID卡拿給服務器看,服務器看了就知道你是誰了,就能夠進行一些後續的操做。固然,若是你是第一次訪問這個服務器,你固然不會有cookie這個ID卡,此時當你發送請求,服務器發現你的head裏面沒有cookie,就知道你是第一次來,就會給你發一張ID卡,也就是幫你配置一個cookie,而後和你請求的數據一塊兒返回回去,給到你的客戶端,也就是瀏覽器,當你的瀏覽器打開頁面的時候,同時也將cookie存到了你瀏覽器裏面。固然,若是你的電腦裏有多個瀏覽器,那麼這些瀏覽器裏的cookie並非相通的。redis
也許有人會說了,服務器看到你的ID卡怎麼就能肯定這必定沒毛病呢?也許是你本身僞造出來的,對的,因此session在這個時候就起做用了。當你第一次訪問服務器的時候,服務器會給你的ID卡上加上sessionid,同時在服務器的內存裏存儲一些信息,而用來標記的就是sessionid。sql
若是有去過健身房的經歷,就知道去的時候,你會把健身卡拿給前臺,前臺刷一下卡,而後就能夠進去健身了。這就跟cookie 和 session 差很少,你去訪問服務器,cookie裏面帶着sessionid, 服務器拿到sessionid,而後進數據庫找一下你的信息,而後再返回相應的頁面回去,其實很是好理解。數據庫
下面來寫一下Django裏有關session 和cookie的具體代碼:django
能夠經過HttpResponse對象中的set_cookie方法來設置cookie。有效期的時間單位是秒,由於要把cookie經過將cookie設置在應答頭裏,因而對象就是HttpResponse。瀏覽器
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
複製代碼
def cookie(request):
response = HttpResponse('ok')
response.set_cookie('message1', 'python1') # 臨時cookie
response.set_cookie('message2', 'python2', max_age=3600) # 有效期一小時
return response
複製代碼
能夠經過HttpResponse對象的COOKIES屬性來讀取本次請求攜帶的cookie值。request.COOKIES爲字典類型。cookie 和session 都是經過字典來保存數據的。因爲cookie是存儲在請求頭裏,因此能夠在request裏面拿到cookie的數據。緩存
def cookie(request):
cookie1 = request.COOKIES.get('message1')
print(cookie1)
return HttpResponse('OK')
複製代碼
能夠經過HttpResponse對象中的delete_cookie方法來刪除。有時候用戶經過某些操做修改或刪除了某些信息,就能夠經過delete_cookie方法刪除。服務器
response.delete_cookie('message2')
複製代碼
cookie的操做差很少就這樣了,接下來的是session的操做:cookie
session有不少中儲存方式,能夠存在數據庫,也能夠存在內存裏面,因此固然能夠用mysql或者redis來存數據。在settings.py文件中,能夠設置session數據的存儲方式,能夠保存在數據庫、本地緩存等。
存儲在數據庫中,以下設置能夠寫,也能夠不寫,這是默認存儲方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'
複製代碼
若是存儲在數據庫中,須要在項INSTALLED_APPS中安裝Session應用。加一行'django.contrib.sessions'就ok
而數據庫裏的session包括了三個重要數據:鍵,值,過時時間。
存在內存裏面,讀取速度快卻是快,可是數據一旦丟失就涼涼,在setting.py裏這麼寫:
SESSION_ENGINE='django.contrib.sessions.backends.cache'
複製代碼
優先從內存中取,找不到就從數據庫裏取
固然還能夠設置數據庫爲mysql 和 redis 這裏網上都有資料。接下來寫一點重要的session操做:
和cookie很像,寫session也是經過鍵值對寫的,取的時候也是同樣
request.session['鍵']=值
request.session.get('鍵',默認值)
複製代碼
清除全部session,在存儲中刪除值部分。
request.session.clear()
複製代碼
清除session數據,在存儲中刪除session的整條數據。
request.session.flush()
複製代碼
刪除session中的指定鍵及值,在存儲中只刪除某個鍵及對應的值。
del request.session['鍵']
複製代碼
設置session的有效期
request.session.set_expiry(value)
複製代碼
差很少cookie和session的基本的知識就總結的差很少了,其實理解過程就是取健身房辦卡的一個過程,而代碼部分也挺好理解,無非就是在請求頭和相應頭裏面加數據或者刪數據,並且都是以鍵值對的形式儲存,因此仍是不難的。
日拱一卒,功不唐捐。
完