1. 程式人生 > >django中session實現方式

django中session實現方式

cookie
  ● 客戶端儲存技術
      ○ cookie是存在瀏覽器的
      ○ 廣告
      ○ 獲得cookies COOKIES 【字典】
      ○ 所有的字典的操作get,items,['']
  ● 如何寫一個cookies
      ○ response.set_cookie() 寫cookie
      ○ key,value
      ○ 過期時間 (expires)如果過期就自動刪除,不過期的話訪問伺服器的時候並且在同一路徑下會自動攜帶cookie的值
      ○ 回話結束 瀏覽器關了
      ○ max_age = 60*10 10分鐘
      ○ path 路徑 路徑相同會自動攜帶 (path) path='/user/'
      ○ 當你訪問127.0.0.1:8000/user/*** 子路徑也算
      ○ 域名要相同
  ● 什麼時候會攜帶cookie
      ○ cookie沒有過期
      ○ 相同path
      ○ 相同域名
  ● 懸浮廣告
  ● cookies的第一應用
      ○ 儲存商品的瀏覽記錄(調整順序和去重)
  ● cookies小結
      ○ cookies 所有對字典的操作都可以對cookie
      ○ cookie的五個屬性 key,value,expries,path,domain
      ○ 從request.COOKIES獲得cookie
      ○ cookie的過期時間None(會話結束就刪除。(瀏覽器關閉)),正數(多少時間過期)
      ○ 從response.set_cookie儲存cookie
      ○ 能不能使用cookie儲存使用者的賬號和密碼?不行。(cookie不能儲存敏感資訊,而且儲存大小和儲存數量郵箱)
  ● session(會話)
      ○ 伺服器的一種儲存技術
      ○ 加入購物車,免登陸
      ○ 預設session會在資料庫中有一張表
      ○ request.session獲得session
  ● session詳解
      ○ session from django.contrib.sessions.backends.db import SessionStore
      ○ session是基於cookie的
      ○ 關鍵是sessionid 不重複
![](https://i.imgur.com/4P326bw.png)
 
      ○ 將物件轉換成字串(序列化)
      ○ {'username':'admin','password':'admin'}
      ○ session中不能儲存自定義物件,如果儲存需要轉換成json物件
  ● 物件是有什麼組成的
      ○ 父類的dict+本類的dict+物件的dict
session中儲存字典
  ● 出問題
  ● session過期時間
  ● 清空session
  ● 刪除session沒講
  ● session購物車
python setup.py sdist upload -r pypi python setup.py register sdist upload
cookie
  ● cookie 在請求中傳給伺服器(Cookie: sex="\347\224\267"; age=10; name=django)
  ● cookie 在響應頭中傳瀏覽器
Set-Cookie: age=10; Path=/
Set-Cookie: name=django; expires=Tue, 31-Oct-2017 01:26:37 GMT; Max-Age=600; Path=/
Set-Cookie: sex="\347\224\267"; Path=/cookiedemo/
 
  ● 什麼傳遞給伺服器cookie?
      ○ 域名
      ○ path
      ○ 時間
  ● request.COOKIES 字典,只要是瀏覽器傳送的一般都認為是隻讀
Session
  ● sesssion基於cookie,伺服器給每一個訪問的瀏覽器唯一的編號(seesionid),下次訪問的時候攜帶sessionid過來,伺服器就知道你之前做了什麼事情
  ● session 服務端儲存技術(django預設實現是基於資料庫的)
  ● settings中 INSTALL_APP中 'django.contrib.sessions',
  ● 寫一個demo,記住瀏覽器傳送的所有的資訊,然後顯示給你
  ● session的操作 類字典 SessionStore例項
      ○ request.sesssion 獲得session
          ■ 例:uname = request.session.get('uname','如果沒有返回這個自定義資訊')
          ■ uname = request.session['uname']
      ○ request.session 初次給session裡面賦值的時候就會建立session
      ○ request.session['user']=user(序列化的)
          ■ name = request.POST['uname']
          ■ request.session['uname'] = name
      ○ request.session.get('user','預設值') 獲得user的值
      ○ del request.sesssion['loginError'] 刪除session中的某個值
      ○ 獲得sesssionkey request.sesssion.sessionkey
      ○ 清空sesssion裡面所有的資料 request.session.clear()
      ○ 刪除session,request.sesssion.flush() 刪除sesssion,包括資料中的
      ○ 設定過期時間,None(不過期),0(瀏覽器關閉過期)10000,時間,什麼時間之後過期
  ● demo
      ○ 免登陸
      ○ 登出 del request.session['user'] 重定向登入介面
      ○ 加購物車(bug)(字典),基於session的
判斷有沒有購物車
建立購物車{}
判斷此商品在不在購物車之內
在就+1,不在就新增到購物車,預設1
再將購物車放到session中
 
  ● django會在session改變的時候講資料儲存到資料庫
      ○ session['age']=10 首次新增
      ○ sesssion['age']=20 算
      ○ sesssion['cart']={'商品的唯一標示':{'goodsid':101,'colorId':101,'sizeId':sizeid},....}
      ○ sesssion['cart']['商品的唯一標示']['sizeId']=200 這算不算改變?不算,因為字典物件沒有發生改變,字典裡面的字典發生了改變。
      ○ request.sesssion.modified = True
 
  ● 需要定時手動清空無效的session
      ○ python manage.py clearsessions
  ● 修改session的預設快取方式
      ○ 資料庫 django.contrib.sessions.backends.db
      ○ 檔案
SESSION_ENGINE='django.contrib.sessions.backends.file'
SESSION_FILE_PATH=os.path.join(BASE_DIR,'cache')    
 
      ○ cache 記憶體
SESSION_ENGINE='django.contrib.sessions.backends.cache'
 
      ○ 雙快取 (記憶體+資料庫),讀取(先讀記憶體,記憶體沒有讀取資料庫,存到記憶體),寫(先寫記憶體再寫資料庫)
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
 
      ○ 基於cookie的
SESSION_ENGINE='django.contrib.sessions.backends.signed_cookies'
 
      ○ redis
static
  ● STATIC_URL = '/static/' 表示在訪問靜態資源的時候,url /static/資源名
      ○ STATIC_URL是給瀏覽器看的
  ● STATICFILES_DIRS 讓伺服器去哪裡找靜態資源
        STATICFILES_DIRS=[
            os.path.join(BASE_DIR,'abc'),
            os.path.join(BASE_DIR,'static')
        ]
 
  ● 好處 304
手動模擬static檔案(基於瀏覽器快取)
  ● 響應頭
      ○ Cache-Control
      ○ Last_Modified
      ○ Set-Cookie
  ● 請求頭
      ○ IfModifiedSince 會攜帶發給瀏覽器的修改時間
      ○ Cookie
      ○ referer(防盜鏈)盜下載連結
  ● 讓瀏覽訪問我的時候,攜帶檔案上一次修改的時間
  ● 從請求中獲得上一次修改的時間,
  ● 和本地這個檔案現在修改時間對比,如果一樣,說明沒修改。返回304,返回新檔案內容
redis
  ● wget 下載,解壓
  ● ./configure(待定)
  ● make 編譯 (gcc)
  ● make install
  ● cd redis解壓目錄
  ● redis-cli 判斷是否安裝成功
  ● 配置環境變數
  ● 配置自啟
(一)django有四中session實現方式
1、資料庫(database-backed sessions)
2、快取(cached sessions)
3、檔案系統(file-based sessions)
4、cookie(cookie-based sessions)
 
其中資料庫方式是預設的也是預設就啟用的,其實現方式實際上是通過django中介軟體實現的,配置在INSTALLED_APPS中的django.contrib.sessions。目前先使用資料庫方式的session,其他以後繼續補充,首先考慮改進為“快取”。
 
(二)django session使用基礎
1、存放資料到session
request.session['some_id'] = some_id
2、從session中讀取存放的資料
session.get('some_id', False)
3、從session中將資料刪除
del request.session['some_id']
4、讓session過期
request.session.set_expiry()
5、在命令列訪問sessin資料
# 生成並儲存session(利用SessionStore)
from django.contrib.sessions.backends.db import SessionStore
sessionStore = SessionStore()
sessionStore["str"] = "hello"                  #  字串對映
sessionStore["dict"] = {};                     #  可以定義多級的字典結構
sessionStore["dict"]["key1"]="value1"
sessionStore["dict"]["key2"]="value2"
sessionStore.save();
print(sessionStore.session_key);
print(sessionStore.keys());
session_key = sessionStore.session_key;
# 讀取儲存的session
from django.contrib.sessions.models import Session
session = Session.objects.get(pk=session_key)
print(session.session_data);                 # 返回session的儲存(加密過)
print(session.get_decoded());                # 返回session的資料結構(加過解碼)  
print(session.expire_date);
注意:
(1)儲存資料的使用使用的是SessionStore讀取資料使用使用的是Session。
(2)在使用多級字典時session["dict"]["key1"] = "something" django預設不會對多級物件進行儲存,需要顯示的使用程式碼