## session
[django1.8.2 session官方中文文檔][1]
session 是一個抽象概念,開發者為了實現中斷和繼續等操作,將 user agent 和 server 之間一對一的交互,抽象為“會話”,進而衍生出“會話狀態”,也就是 session 的概念。
### 定義
在WEB開發中,服務器可以為每個用戶瀏覽器創建一個會話對象(session對象),注意:一個瀏覽器獨占一個session對象(默認情況下)。因此,在需要保存用戶數據時,服務器程序可以把用戶數據寫到用戶瀏覽器獨占的session中,當用戶使用瀏覽器訪問其它程序時,其它程序可以從用戶的session中取出該用戶的數據,為用戶服務。
需要注意:**新開的瀏覽器窗口會生成新的Session**,但子窗口除外。子窗口會共用父窗口的Session。例如,在鏈接上右擊,在彈出的快捷菜單中選擇"在新窗口中打開"時,子窗口便可以訪問父窗口的Session。
由于HTTP協議是`無狀態`的協議,所以服務端需要記錄用戶的狀態時,就需要用某種機制來識具體的用戶,這個機制就是Session。典型的場景比如購物車。當你點擊下單按鈕時,由于HTTP協議無狀態,所以并不知道是哪個用戶操作的,所以服務端要為特定的用戶創建了特定的Session,用用于標識這個用戶,并且跟蹤用戶,這樣才知道購物車里面有幾本書。這個Session是保存在服務端的,有一個唯一標識。在服務端保存Session的方法很多,內存、數據庫、文件都有。集群的時候也要考慮Session的轉移,在大型的網站,一般會有專門的Session服務器集群,用來保存用戶會話,這個時候 Session 信息都是放在內存的,使用一些緩存服務比如Memcached之類的來放 Session。
### 用途
Session可以記錄用戶的`登錄與行為數據`,即記錄下用戶目前訪問服務器上的那些內容,狀態是什么,而考慮到這些數據用戶修改的隨意性很大,并沒有必要直接存儲在數據庫中。
在用戶執行刷新操作時,即再次訪問服務器時,可以直接根據Session,打開用戶上次訪問時網頁的狀態(如用戶輸入的表單內容等等),為用戶帶來更優的體驗,提供個性化服務。
用戶的session信息非常關鍵,它記錄了用戶在進入頁面、查看結果、點擊結果以及后繼的操作(比如翻頁、加購物車等)。只有通過session信息才能把用戶的行為聯系起來,構建出完整的模型,因此從海量數據中把每一個用戶所有session的操作都完整地挖掘出來非常重要。
簡單通俗的講session就是象一個臨時的容器 來存放這些臨時的東西 從你登陸開始就保存在session里 當然你可以自己設置它的有效時間和頁面。舉個簡單的例子 我們做一個購書的JSP網站 顧客買書的時候會挑選出一些書 但是在付錢之前還可以修改,所以不能存到數據庫 就可以先保存在session里 等到確認了以后再放入數據庫
### session實現方式
cookie實現會話管理
一般只將session的id存儲在cookie中
URL重寫實現會話管理
URL重寫就是將需要記錄的信息附加在請求的鏈接背后,以鏈接參數的形式發送給服務器識別。具體實現的過程會在后文結合cookie詳解。
### session和cookie的有效時長
session和cookie的有效時長session的有效時長服務器會把長時間沒有活動的Session從服務器內存中清除,此時Session便失效。具體根據服務器設置,一般在二三十分鐘左右。
cookie的有效時長cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用范圍。通過過期時間可以設置cookie的有效時長若不設置過期時間: 表示這個cookie的生命周期為瀏覽器回話期間,關閉訪問服務器的瀏覽器窗口,cookie就消失了。一般稱為回話cookie,保存在內存中若設置了過期時間:則cookie會存儲在硬盤上,直到超過有效時間。
## 配置和用法
Django中默認支持Session,其內部提供了5種類型的Session供開發者使用:
* 數據庫(默認)
* 緩存
* 文件
* 緩存+數據庫
* 加密cookie
### 配置
緩存的設置 http://python.usyiyi.cn/translate/django_182/topics/cache.html
在settings.py中
#### 公共部分-默認值
~~~
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之后才保存
~~~
#### 不同部分
~~~
# 數據庫引擎(默認)
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# 緩存Session引擎
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置
# 緩存+數據庫Session 引擎
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
# 文件Session引擎
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()
# 加密cookie Session引擎
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
~~~
### 用法
~~~
## 對單個鍵值對操作
# 獲取Session中指定key的值
request.session['key']
request.session.get('key',None)
# 設置或者更新key的值
request.session['key'] = 123
# 設置key的值,存在則不設置,相當于設置默認值
request.session.setdefault('key',123)
# 刪除指定key的值
del request.session['key']
# 刪除當前用戶的所有Session數據
request.session.delete("session_key")
# 清除用戶的sesseion數據,用戶logout
request.session.clear()
# 獲取用戶session的隨機字符串
request.session.session_key
# 將所有Session失效日期小于當前日期的數據刪除
request.session.clear_expired()
# 檢查 用戶session的隨機字符串 在數據庫中是否
request.session.exists("session_key")
## 對所有鍵值對操作
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
request.session.set_expiry(value)
* 如果value是個整數,session會在些秒數后失效。
* 如果value是個datatime或timedelta,session就會在這個時間后失效。
* 如果value是0,用戶關閉瀏覽器session就會失效。
* 如果value是None,session會依賴全局session失效策略。
~~~
[1]:http://python.usyiyi.cn/translate/django_182/topics/http/sessions.html