從內部來看,每個session都只是一個普通的Django model(在 django.contrib.sessions.models 中定義)。每個session都由一個隨機的32字節哈希串來標識,并存儲于cookie中。 因為它是一個標準的模型,所以你可以使用Django數據庫API來存取session。
1
2
3
4
|
>>> s = Session.objects.get(pk = '2b1189a188b44ad18c35e113ac6ceead' ) >>> s.expire_date datetime.datetime( 2005 , 8 , 20 , 13 , 35 , 12 ) |
你需要使用get_decoded() 來讀取實際的session數據。 這是必需的,因為字典存儲為一種特定的編碼格式。
1
2
3
4
|
>>> s.session_data 'KGRwMQpTJ19hdXRoX3VzZXJfaWQnCnAyCkkxCnMuMTExY2ZjODI2Yj...' >>> s.get_decoded() { 'user_id' : 42 } |
何時保存Session
缺省的情況下,Django只會在session發生變化的時候才會存入數據庫,比如說,字典賦值或刪除。
1
2
3
4
5
6
7
8
9
10
11
12
|
# Session is modified. request.session[ 'foo' ] = 'bar' # Session is modified. del request.session[ 'foo' ] # Session is modified. request.session[ 'foo' ] = {} # Gotcha: Session is NOT modified, because this alters # request.session['foo'] instead of request.session. request.session[ 'foo' ][ 'bar' ] = 'baz' |
你可以設置 SESSION_SAVE_EVERY_REQUEST 為 True 來改變這一缺省行為。如果置為True的話,Django會在每次收到請求的時候保存session,即使沒發生變化。
注意,會話cookie只會在創建和修改的時候才會送出。 但如果 SESSION_SAVE_EVERY_REQUEST 設置為 True ,會話cookie在每次請求的時候都會送出。 同時,每次會話cookie送出的時候,其 expires 參數都會更新。