Django 學習之cookie與session

.cookiesession的介紹

cookie不屬於http協議範圍,因爲http協議沒法保持狀態,但實際狀況,咱們卻又須要「保持狀態」,所以cookie就是在這樣一個場景下誕生。html

 

cookie的工做原理是:由服務器產生內容,瀏覽器收到請求後保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上cookie,這樣服務器就能經過cookie的內容來判斷這個是「誰」了。前端

 

cookie雖然在必定程度上解決了「保持狀態」的需求,可是因爲cookie自己最大支持4096字節,以及cookie自己保存在客戶端,可能被攔截或竊取,所以就須要有一種新的東西,它能支持更多的字節,而且他保存在服務器,有較高的安全性。這就是sessionpython

 

問題來了,基於http協議的無狀態特徵,服務器根本就不知道訪問者是「誰」。那麼上述的cookie就起到橋接的做用。web

 

咱們能夠給每一個客戶端的cookie分配一個惟一的id,這樣用戶在訪問時,經過cookie,服務器就知道來的人是「誰」。而後咱們再根據不一樣的cookieid,在服務器上保存一段時間的私密資料,如「帳號密碼」等等。數據庫

 

總結而言:cookie彌補了http無狀態的不足,讓服務器知道來的人是「誰」;可是cookie以文本的形式保存在本地,自身安全性較差;因此咱們就經過cookie識別不一樣的用戶,對應的在session裏保存私密的信息以及超過4096字節的文本。django

另外,上述所說的cookiesession實際上是共通性的東西,不限於語言和框架瀏覽器

.Cookie概述

1.什麼叫Cookie

Cookie翻譯成中文是小甜點,小餅乾的意思。在HTTP中它表示服務器送給客戶端瀏覽器的小甜點。其實Cookiekey-value結構,相似於一個python中的字典。隨着服務器端的響應發送給客戶端瀏覽器。而後客戶端瀏覽器會把Cookie保存起來,當下一次再訪問服務器時把Cookie再發送給服務器。 Cookie是由服務器建立,而後經過響應發送給客戶端的一個鍵值對。客戶端會保存Cookie,並會標註出Cookie的來源(哪一個服務器的Cookie)。當客戶端向服務器發出請求時會把全部這個服務器Cookie包含在請求中發送給服務器,這樣服務器就能夠識別客戶端了!緩存

2.Cookie的原理安全

cookie的工做原理是:瀏覽器訪問服務端,帶着一個空的cookie,而後由服務器產生內容,瀏覽器收到相應後保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上Cookie,這樣服務器就能經過Cookie的內容來判斷這個是「誰」了。服務器

2.查看Cookie

    咱們使用Chrome瀏覽器,打開開發者工具。 

3.cookie圖解

4.Cookie規範

Cookie大小上限爲4KB

 一個服務器最多在客戶端瀏覽器上保存20Cookie

 一個瀏覽器最多保存300Cookie,由於一個瀏覽器能夠訪問多個服務器。

    上面的數據只是HTTPCookie規範,但在瀏覽器大戰的今天,一些瀏覽器爲了戰勝對手,爲了展示本身的能力起見,可能對Cookie規範「擴展」了一些,例如每一個Cookie的大小爲8KB,最多可保存500Cookie等!但也不會出現把你硬盤佔滿的可能!

注意,不一樣瀏覽器之間是不共享Cookie的。也就是說在你使用IE訪問服務器時,服務器會把Cookie發給IE,而後由IE保存起來,當你在使用FireFox訪問服務器時,不可能把IE保存的Cookie發送給服務器。

5.CookieHTTP 

Cookie是經過HTTP請求和響應頭在客戶端和服務器端傳遞的:

Cookie:請求頭,客戶端發送給服務器端;

格式:Cookie: a=A; b=B; c=C。即多個Cookie用分號離開; l Set-Cookie:響應頭,服務器端發送給客戶端;

一個Cookie對象一個Set-CookieSet-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C  

6.Cookie的覆蓋

若是服務器端發送重複的Cookie那麼會覆蓋原有的Cookie,例如客戶端的第一個請求服務器端發送的Cookie是:Set-Cookie: a=A;第二請求服務器端發送的是:Set-Cookie: a=AA,那麼客戶端只留下一個Cookie,即:a=AA

.Djangocookie的簡單使用

Ctrl + Shift + del三個鍵來清除頁面緩存和cookie,未來這個操做你會用的不少。

1.獲取Cookie

request.COOKIES.get("islogin",None)  #若是有就獲取,沒有就默認爲none

 

request.COOKIES['key']

request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

參數:

default: 默認值

salt: 加密鹽

max_age: 後臺控制過時時間

 

2.設置Cookie

  obj = redirect("/index/")

  obj.set_cookie("islogin",True)  #設置cookie值,注意這裏的參數,一個是鍵,一個是值

  obj.set_cookie("haiyan","344",20)  #20表明過時時間

  obj.set_cookie("username", username)

 

例子2

rep = HttpResponse(...)

rep render(request, ...)

 

rep.set_cookie(key,value,...)

rep.set_signed_cookie(key,value,salt='加密鹽', max_age=None, ...)

 

參數:

key,

value='',

max_age=None, 超時時間

expires=None, 超時時間(IE requires expires, so set it if hasn't been already.)

path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie能夠被任何url的頁面訪問

domain=None, Cookie生效的域名

secure=False, https傳輸

httponly=False 只能http協議傳輸,沒法被JavaScript獲取(不是絕對,底層抓包能夠獲取到也能夠被覆蓋)

3.刪除Cookie

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

 

def logout(request):

    rep = redirect("/login/")

    rep.delete_cookie("user")  # 刪除用戶瀏覽器上以前設置的usercookie

    return rep

登陸認證示例:

須要知道幾點

一共有三次請求

  注意:form表單的action走的路徑仍是/login/

     第一次請求:url:http://127.0.0.1:8080/login get請求

       第一次請求:url:http://127.0.0.1:8080/login post請求 user pasw

       第一次請求:url:http://127.0.0.1:8080/index post請求 攜帶着cookie的了

       因此在index頁面中就會取到cookie,由於這是的index裏面已經有cookie

 

cookie存儲到客戶端

優勢:數據存儲在客戶端。減輕服務端的壓力,提升網站的性能

缺點:安全性不高,在客戶端很容易被查看或破解用戶會話信息

4.用戶註銷刪除cookie頁面訪問案例

例:

urls.py

from cookie import views

urlpatterns = [

    path('admin/', admin.site.urls),

    path('login/', views.login),

    path('index/', views.index),

    path('logout/', views.logout),

    path('order/', views.order),

]

views.py

from django.shortcuts import render, HttpResponse, redirect

from cookie import models

def login(request):

    if request.method == "GET":

        return render(request, "login.html")

    username = request.POST.get("username")

    password = request.POST.get("pwd")

    user_obj = models.Userinfo.objects.filter(username=username, password=password).first()

    if not user_obj:

        return redirect("/login/")

    else:

        rep = redirect("/index/")

        rep.set_cookie("is_login", True)

        # rep.set_cookie("username",user_obj.name)

        return rep

 

 

def index(request):

    status = request.COOKIES.get("is_login")  # cookie的提交數據

    if not status:

        return redirect('/login/')

    return render(request, "index.html")

 

# 同理index頁面的限制

def order(request):

    status = request.COOKIES.get("is_login")  # cookie的提交數據

    if not status:

        return redirect('/login/')

    return render(request, "order.html")

 

 

def logout(request):

    rep = redirect('/login/')

    # 註銷後刪除cookie,訪問index將訪問不了,這樣能夠限制沒有登陸的用戶對index頁面的訪問

    rep.delete_cookie("is_login")

    return rep

 

前端三個頁面的內容爲:

login.html

<body>

<h3>用戶登陸</h3>

<form action="" method="post">

{% csrf_token %}

    <p>用戶名:<input type="text" name="username"></p>

    <p>密碼  :<input type="password" name="pwd"></p>

    <input type="submit">

</form>

</body>

 

index.html

<body>

<p>index 頁面。。。。</p>

<a href="/logout/">註銷</a>

</body>

order.html

<body>

<p>order 頁面。。。。</p>

<a href="/logout/">註銷</a>

</body>

 

.Django session的簡單使用

1.Session介紹

Session是服務器端技術,利用這個技術,服務器在運行時能夠 爲每個用戶的瀏覽器建立一個其獨享的session對象,因爲 session爲用戶瀏覽器獨享,因此用戶在訪問服務器的web資源時 ,能夠把各自的數據放在各自的session中,當用戶再去訪問該服務器中的其它web資源時,其它web資源再從用戶各自的session中 取出數據爲用戶服務。

2.Session圖解

3.爲何須要Session

Cookie雖然在必定程度上解決了「保持狀態」的需求,可是因爲Cookie自己最大支持4096字節,以及Cookie自己保存在客戶端,可能被攔截或竊取,所以就須要有一種新的東西,它能支持更多的字節,而且他保存在服務器,有較高的安全性。這就是Session

 

  問題來了,基於HTTP協議的無狀態特徵,服務器根本就不知道訪問者是「誰」。那麼上述的Cookie就起到橋接的做用。

 

  咱們能夠給每一個客戶端的Cookie分配一個惟一的id,這樣用戶在訪問時,經過Cookie,服務器就知道來的人是「誰」。而後咱們再根據不一樣的Cookieid,在服務器上保存一段時間的私密資料,如「帳號密碼」等等。

 

  總結而言:Cookie彌補了HTTP無狀態的不足,讓服務器知道來的人是「誰」;可是Cookie以文本的形式保存在本地,自身安全性較差;因此咱們就經過Cookie識別不一樣的用戶,對應的在Session裏保存私密的信息以及超過4096字節的文本。

 

  另外,上述所說的CookieSession實際上是共通性的東西,不限於語言和框架。

4.基本操做

(1)設置session

    request.session["session_name"]="admin"

(2)獲取session

    session_name = request.session("session_name")

(3)刪除session

    del request.session["session_name"]  刪除一組鍵值對

    request.session.flush()   刪除一條記錄

(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() 刪除當前的會話數據並刪除會話的Cookie

            這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問

            例如,django.contrib.auth.logout() 函數中就會調用它。

 

(11)用戶session的隨機字符串

        request.session.session_key

  

        # 將全部Session失效日期小於當前日期的數據刪除

        request.session.clear_expired()

  

        # 檢查 用戶session的隨機字符串 在數據庫中是否

        request.session.exists("session_key")

  

        # 刪除當前用戶的全部Session數據

        request.session.delete("session_key")

  

        request.session.set_expiry(value)

            * 若是value是個整數,session會在些秒數後失效。

            * 若是value是個datatimetimedeltasession就會在這個時間後失效。

            * 若是value0,用戶關閉瀏覽器session就會失效。

            * 若是valueNone,session會依賴全局session失效策略。

5.session配置

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默認)       

SESSION_COOKIE_NAME "sessionid"                       

# Sessioncookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)

SESSION_COOKIE_PATH "/"                               

# Sessioncookie保存的路徑(默認)

SESSION_COOKIE_DOMAIN = None                             

# Sessioncookie保存的域名(默認)

SESSION_COOKIE_SECURE = False                            

# 是否Https傳輸cookie(默認)

SESSION_COOKIE_HTTPONLY = True                          

 # 是否Sessioncookie只支持http傳輸(默認)

SESSION_COOKIE_AGE = 1209600                             

# Sessioncookie失效日期(2周)(默認)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  

# 是否關閉瀏覽器使得Session過時(默認)

SESSION_SAVE_EVERY_REQUEST = False                       

# 是否每次請求都保存Session,默認修改以後才保存(默認)

 

6.session案例

urls.py

from session import views as session_views

urlpatterns = [

    path('admin/', admin.site.urls),

    path('session_login/', session_views.login),

    path('s_index/', session_views.s_index),

    path('s_logout/', session_views.s_logout),

]

 

views.py

from django.shortcuts import render, HttpResponse, redirect

from session import models

# Create your views here.

def login(request):

    if request.method == "GET":

        return render(request, "login.html")

    username = request.POST.get("username")

    password = request.POST.get("pwd")

 

    user_obj = models.Userinfo.objects.filter(username=username, password=password).first()

    if not user_obj:

        return redirect("/login/")

    else:

        rep = redirect("/index/")

        rep.set_cookie("is_login", True)

        # rep.set_cookie("username",user_obj.name)

        return rep

 

 

def index(request):

    status = request.COOKIES.get("is_login")  # cookie的提交數據

    if not status:

        return redirect('/login/')

    return render(request, "index.html")

 

# 同理index頁面的限制

def order(request):

    status = request.COOKIES.get("is_login")  # cookie的提交數據

    if not status:

        return redirect('/login/')

    return render(request, "order.html")

 

 

def logout(request):

    rep = redirect('/login/')

    # 註銷後刪除cookie,訪問index將訪問不了,這樣能夠限制沒有登陸的用戶對index頁面的訪問

    rep.delete_cookie("is_login")

    return rep

 

s_index.html

<body>

<p>session index 頁面。。。。</p>

<a href="/s_logout/">註銷</a>

</body>

</body>

 

關於session存在和消失的時候:

相關文章
相關標籤/搜索