session的工作原理、django的超時時間設置及session過期判斷


1、session原理

cookie是保存在用戶瀏覽器端的鍵值對

session是保存在服務器端的鍵值對

session服務端中存在的數據為:

復制代碼
復制代碼
session = {

   隨機字符串1:{

   用戶1的相關信息

}

   隨機字符串2:{

   用戶2的相關信息

}

}
復制代碼
復制代碼

session客戶端即客戶端的瀏覽器的cookie中存的數據是當前用戶對應的隨機字符串

2、session詳細解析(是否過期、失效時間)

  Session一直是我們做web項目經常使用的,以前沒太注意,這次又細致的看了下!

  1.session其實就是一個Map,鍵=值對,通過session.getAttribute("name");獲得session中設置的參數

  2.session的過期時間是從什么時候開始計算的?是從一登錄就開始計算還是說從停止活動開始計算?

  答:從session不活動的時候開始計算,如果session一直活動,session就總不會過期。

         從該Session未被訪問,開始計時; 一旦Session被訪問,計時清0;

3、session的工作過程

1、    生成隨機字符串

2、    寫到用戶瀏覽器的cookie中

3、    保存到session中

4、    在隨機字符串對應的字典中設置相關內容

而上述過程在Django中的體現為:

request.session["username"]=user

這里的username為通過request.POST.get("username")從前端html頁面中獲取到的用戶名信息

注意:

在Django中要用session中一定要先執行:

python manage.py makemigrations

python manage.py migrate

當用戶登錄的時候的就會在數據庫的django_session表中記錄session信息

同樣的通過request.session["username"]也可以獲取相應的值

在這個過程中:

1、    首先獲取當前用戶的隨機字符串

2、    根據隨機字符串獲取對應的內容

4、session的操作

request.session["k1"]  如果不存在則會報錯

request.session.get["k1"],如果不存在則會報錯,為了防止出錯可以request.session.get('k1',none)

 

request.session['k1'] = 123 設置session值

request.session.setdefault('k1',123)  存在則不設置

del request.session['k1']  刪除

request.session.clear()    刪除

所有 鍵、值、鍵值對

request.session.keys()

request.session.values()

request.session.items()

request.session.iterkeys()

request.session.itervalues()

request.session.iteritems()

 

用戶session的隨機字符串

request.session.session_key

 

將所有Session失效日期小於當前日期的數據刪除

request.session.clear_expired()

 

檢查 用戶session的隨機字符串 在數據庫中是否

request.session.exists("session_key")

 

刪除當前用戶的所有Session數據

request.session.delete("session_key")

5、session 的超時時間設置

 5.1、django中 settings中的設置

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使用比較簡單,在request.session是一個字典類。session是保存在數據庫中的。

 5.2、在views中的設置

request.session.set_expiry(value)

默認的過期時間是兩周,如果自己設置了過期時間,這樣自己設定的優先級就會高於默認的

如果value是個整數,session會在些秒數后失效。

如果value是個datatime或timedelta,session就會在這個時間后失效。

如果value是0,用戶關閉瀏覽器session就會失效。

如果value是None,session會依賴全局session失效策略。

注意:

Django中設置session過期時間:
request.session.set_expiry(timedelta(days=30))
運行提示錯誤:TypeError: datetime.datetime(2018, 7, 3, 7, 36, 57, 636224, tzinfo=<UTC>) is not JSON serializable

解決辦法:
在setting中添加:
SESSION_SERIALIZER='django.contrib.sessions.serializers.PickleSerializer'

6、Django中對於session的存儲方式

Django中支持session,其中內部提供了5種類型的session供開發者使用:

數據庫(默認)

緩存

文件

緩存+數據庫

加密cookie

1、如果是數據庫,需要在settings.py中配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.db' (引擎(默認))

2、如果是緩存session,需要在settings.py中配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'(引擎)

SESSION_CACHE_ALIAS= 'default'  使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置

1、    如果是文件session, 需要在settings.py中配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.file' (引擎)

SESSION_FILE_PATH=None  緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()   

2、    如果是緩存+數據庫session,需要在settings.py中配置如下:

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'       (引擎)

7、session的過期判斷;

 1)  以前是根據 if(session.getAttribute('user')==null)判斷是否為空

  =========================================================================================

 2) 如下為看到的一個帖子,判斷session不為空的好方法:

     request.getSeesion(boolean)方法,一下子讓我恍然大悟。這個方法里面傳了一個boolean值,這個值如果是true,那么如   果當前的request的session不可用,那么就創建新的會話,如果存在就返回當前的會話。如果參數是false,那么在request的當前會話不存在的時候就返回null。
           這樣我們就可以很容易的聯想到這個所謂的request的當前會話是否存在和session過期的聯系,所以我們就可以“近似地”認為session不存在就是session過期了,那么我們就可以很容易地判斷session是否過期了。方法如下:

      if(request.getSession(false)==null){ 

  System.out.println("Session has been invalidated!"); 

  }

  else{ 

  System.out.println("Session is active!"); 

  }

 

  可能大家注意到我上面有一個“近似地”字眼,也就是說存在特別情況。
       這個特殊情況就是第一次請求還沒有創建會話的時候,那么用這個方法返回的仍然是null


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM