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預設不會對多級物件進行儲存,需要顯示的使用程式碼