Django 5種類型Session使用方法解析
介紹
Session:在計(jì)算機(jī)中,尤其是在網(wǎng)絡(luò)應(yīng)用中,稱為“會(huì)話控制”。Session 對(duì)象存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息。這樣,當(dāng)用戶在應(yīng)用程序的 Web 頁(yè)之間跳轉(zhuǎn)時(shí),存儲(chǔ)在 Session 對(duì)象中的變量將不會(huì)丟失,而是在整個(gè)用戶會(huì)話中一直存在下去。
當(dāng)用戶請(qǐng)求來自應(yīng)用程序的 Web 頁(yè)時(shí),如果該用戶還沒有會(huì)話,則 Web 服務(wù)器將自動(dòng)創(chuàng)建一個(gè) Session 對(duì)象。當(dāng)會(huì)話過期或被放棄后,服務(wù)器將終止該會(huì)話。Session 對(duì)象最常見的一個(gè)用法就是存儲(chǔ)用戶的首選項(xiàng)。
session是基于cookie完成的,當(dāng)用戶打開瀏覽器,去訪問服務(wù)器的時(shí)候,服務(wù)器會(huì)為每個(gè)用戶的瀏覽器創(chuàng)建一個(gè)會(huì)話對(duì)象(session對(duì)象),并且為每個(gè)session對(duì)象創(chuàng)建一個(gè)Jsessionid號(hào)。當(dāng)session對(duì)象創(chuàng)建成功后,會(huì)以cookie的方式將這個(gè)Jsessionid號(hào)回寫給瀏覽器,當(dāng)用戶再次進(jìn)行訪問服務(wù)器時(shí),及帶了具有Jsessionid號(hào)的cookie數(shù)據(jù)來一起訪問服務(wù)器,服務(wù)器通過不同session的 Jsessionid號(hào)來找出與其相關(guān)聯(lián)的session對(duì)象,通過不同的session對(duì)象來為不同的用戶服務(wù)。
使用
Django中默認(rèn)支持Session,其內(nèi)部提供了5種類型的Session供開發(fā)者使用:
- 數(shù)據(jù)庫(kù)(默認(rèn))
- 緩存
- 文件
- 緩存+數(shù)據(jù)庫(kù)
- 加密cookie
數(shù)據(jù)庫(kù)Session
Django默認(rèn)支持Session,并且默認(rèn)是將Session數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,即:django_session 表中。 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認(rèn)) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串(默認(rèn)) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認(rèn)) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認(rèn)) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認(rèn)) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認(rèn)) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認(rèn)) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過期(默認(rèn)) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存(默認(rèn)) b. 使用 def index(request): # 獲取、設(shè)置、刪除Session中數(shù)據(jù) request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在則不設(shè)置 del request.session['k1'] # 所有 鍵、值、鍵值對(duì) request.session.keys() request.session.values() request.session.items() # 3.0無下面3個(gè)方法 request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 用戶session的隨機(jī)字符串 request.session.session_key # 將所有Session失效日期小于當(dāng)前日期的數(shù)據(jù)刪除 request.session.clear_expired() # 檢查 用戶session的隨機(jī)字符串 在數(shù)據(jù)庫(kù)中是否 request.session.exists("session_key") # 刪除當(dāng)前用戶的所有Session數(shù)據(jù) request.session.delete("session_key") request.session.delete() request.session.flush() request.session.set_expiry(value) * 如果value是個(gè)整數(shù),session會(huì)在些秒數(shù)后失效。 * 如果value是個(gè)datatime或timedelta,session就會(huì)在這個(gè)時(shí)間后失效。 * 如果value是0,用戶關(guān)閉瀏覽器session就會(huì)失效。 * 如果value是None,session會(huì)依賴全局session失效策略。
緩存Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認(rèn)內(nèi)存緩存,也可以是memcache),此處別名依賴緩存的設(shè)置
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串
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 # 是否關(guān)閉瀏覽器使得Session過期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存
b. 使用
同上
文件Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個(gè)臨時(shí)地址tempfile.gettempdir() #
如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時(shí)的key,即:sessionid=隨機(jī)字符串
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 # 是否關(guān)閉瀏覽器使得Session過期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次請(qǐng)求都保存Session,默認(rèn)修改之后才保存
b. 使用
同上
緩存+數(shù)據(jù)庫(kù)Session
數(shù)據(jù)庫(kù)用于做持久化,緩存用于提高效率
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
b. 使用
同上
加密cookie Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
b. 使用
同上
登錄狀態(tài)驗(yàn)證
def login_status(func): def warp(request,*args,**kwargs): user = request.session.get("username") if user: kwargs["username"] = user return func(request,*args,**kwargs) return redirect(login) return warp
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Django websocket原理及功能實(shí)現(xiàn)代碼
這篇文章主要介紹了Django websocket原理及功能實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Python的Flask框架路由實(shí)現(xiàn)詳解
這篇文章主要介紹了Python的Flask框架路由實(shí)現(xiàn)詳解,在啟動(dòng)程序時(shí),python解釋器會(huì)從上到下對(duì)代碼進(jìn)行解釋,當(dāng)遇到裝飾器時(shí),會(huì)執(zhí)行,并把函數(shù)對(duì)應(yīng)的路由以字典的形式進(jìn)行存儲(chǔ),當(dāng)請(qǐng)求到來時(shí),即可根據(jù)路由查找對(duì)應(yīng)要執(zhí)行的函數(shù)方法,需要的朋友可以參考下2023-08-08python?包?requests?實(shí)現(xiàn)請(qǐng)求操作
這篇文章主要介紹了python?包?requests?實(shí)現(xiàn)請(qǐng)求操作,文章介紹內(nèi)容包括帶參數(shù)請(qǐng)求、自定義headers,文章內(nèi)容詳細(xì)具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04Python網(wǎng)絡(luò)編程之ftplib模塊
這篇文章介紹了Python網(wǎng)絡(luò)編程之ftplib模塊,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05一篇文章帶你搞懂Python類的相關(guān)知識(shí)
今天我們要說的是面向?qū)ο蟮暮诵?----類,類能幫我們把復(fù)雜的事情變得有條理,有順序,希望大家通過學(xué)習(xí)類能改善自己的編碼風(fēng)格,使代碼變得更為好看,更加通俗易懂,需要的朋友可以參考下2021-05-05