从内部来看,每个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 参数都会更新。