Django中的Cookie和Session

cookie和session
HTTP被設計爲」無􏲃態」,也就是俗稱「臉盲」也就是所謂的亂碼。 這一次請求和下一次請求 之間沒有任何􏲃狀態保持,咱們沒法根據請求的任何方面(IP地址,用戶代理等)來識別來自同一人的連續􏵎請求。實現狀態保持的方式:在客戶端或服務器端存儲與會話有關的數據(客戶端與服務器端的一次通訊,就是一次會話)html

cookie
session
不一樣的請求者之間不會共享這些數據,cookie和session與請求者一一對應。python

1、cookie
cookies 是瀏覽器爲 Web 服務器存􏸀的一小􏷠信息。 每次瀏覽器從某個服務器請求頁面 時,都會自動帶上之前收到的cookie。cookie保存在客戶端,安全性較差,注意不要保存敏感信息。典型應用:數據庫

網站登陸
購物車django


用法:瀏覽器

第一步獲取cookie:安全

 

?
1
2
3
4
5
#1 獲取cookie
HttpRequest.COOKIES.get(key)
 
#獲取加「鹽」的cookie
HttpRequest.get_signed_cookie(key, default = RAISE_ERROR, salt = '', max_age = None )

第二步設置cookie;  服務器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2.設置cookie
HttpResponse.set_cookie(key, value = ' ', max_age=None, expires=None, path=' / ', domain = None , secure = None , httponly = False )
參數:
     key:    cookie的名稱( * )
     value:   cookie的值,默認是空字符
     max_age:cookies的持續有效時間(以秒計),若是設置爲 None ,cookies 在瀏覽器關閉的時候就失效了。
     expires:cookies的過時時間,格式: "Wdy, DD-Mth-YY HH:MM:SS GMT" 若是設置這個參數,它將覆蓋max_age。
     path:    cookie生效的路徑前綴,瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣你能夠避免將cookie傳給
              站點中的其餘的應用。 / 表示根路徑,特殊的:根路徑的cookie能夠被任何url的頁面訪問
     domain:   cookie生效的站點。你可用這個參數來構造一個跨站cookie。如, domain = ".example.com" 所構造的
               cookie對下面這些站點都是可 讀的: www.example.com 、 www2.example.com。
               若是該參數設置爲 None ,cookie只能由設置它的站點讀取。
     secure:   若是設置爲 True ,瀏覽器將經過HTTPS來回傳cookie。
     httponly: 僅http傳輸   不能使用js獲取cookie
 
#同set_cookie,不一樣點在於設置salt,即加鹽,加密存儲cookie數據
HttpResponse.set_signed_cookie(key, value, salt = ' ', max_age=None, expires=None, path=' / ', domain = None , secure = None , httponly = False )

 第三步刪除cookie:cookie

?
1
# 3刪除cookie <br>HttpResponse.delete_cookie(key, path='/', domain=None)

 

2、session
cookie看似解決了HTTP(短鏈接、無狀態)的會話保持問題,但把所有用戶數據保存在客戶端,存在安全隱患,session

因而session出現了。咱們能夠 把關於用戶的數據保存在服務端,在客戶端cookie里加一個sessionID(隨機字符串)。其工做流程:dom

(1)、當用戶來訪問服務端時,服務端會生成一個隨機字符串;

(2)、當用戶登陸成功後 把 {sessionID :隨機字符串} 組織成鍵值對加到cookie裏發送給用戶;

(3)、服務器以發送給客戶端 cookie中的隨機字符串作鍵,用戶信息作值,保存用戶信息;

(4)、再訪問服務時客戶端會帶上sessionid,服務器根據sessionid來確認用戶是否訪問過網站

2.1 cookie和session的區別與聯繫
區別
session將數據存儲與服務器端 cookie存儲在客戶端
cookie 存儲在客戶端,不安全,sess存儲在服務器端,客戶端只存sesseionid,安全
cookie在客戶端存儲值有大小的限制,大約幾kb。session沒有限制
聯繫
session 基於cookie
2.2 session配置
首先在settings.py中有以下配置(系統默認),

第一步:

進行數據遷移,生成session使用的數據庫表

?
1
2
3
4
5
6
INSTALLED_APPS = [
     'django.contrib.sessions' ,
]
MIDDLEWARE = [
     'django.contrib.sessions.middleware.SessionMiddleware' ,
]

第二步:

session設置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def doregister(request):
     username = request.POST.get( 'username' )
     password = request.POST.get( 'password' )
     email = request.POST.get( 'email' )
     user = User()
     user.username = username
     user.password = md5(password.encode( 'utf8' )).hexdigest()
     user.email = email
     user.save()
     # 設置session
     request.session[ 'username' ] = username
     return render(request, "common/notice.html" ,context = {
         'code' : 1 ,
         'msg' : '註冊成功' ,
         'url' : 'three:index' ,
         'wait' : 3
     })

session獲取:

?
1
2
3
4
def index(request):
     # session獲取
     username = request.session.get( 'username' )
     return render(request, 'three/index.html' ,context = { 'username' :username})

session刪除:

    • clear() 清空全部session 可是不會將session表中的數據刪除
    • flush() 清空全部 並刪除表中的數據
    • logout() 退出登陸 清除全部 並刪除表中的數據
    • del req.session[‘key’] 刪除某一個session的值
    • 代碼以下:
    • ?
      1
      2
      3
      def logout(request):
           request.session.flush()
           return redirect(reverse( "three:index" ))
相關文章
相關標籤/搜索