W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
可以通過(guò)繼承 ?AbstractBaseSession
?和 ?SessionStore
?類來(lái)創(chuàng)建基于Django中包含的自定義數(shù)據(jù)庫(kù)支持的會(huì)話引擎(即 ?db
?和 ?cached_db
?)。
?AbstractBaseSession
?和 ?BaseSessionManager
?可以從 ?django.contrib.sessions.base_session
導(dǎo)入,因此它們可以在 ?INSTALLED_APPS
?不包含 ?django.contrib.sessions
? 的情況下導(dǎo)入。
抽象基本會(huì)話模型
session_key
?:主鍵。字段本身可能包含多達(dá)40個(gè)字符。當(dāng)前實(shí)現(xiàn)生成一個(gè)32個(gè)字符的字符串(一個(gè)隨機(jī)的數(shù)字序列和小寫的ascii字母)。session_data
?:包含編碼和序列化會(huì)話字典的字符串。expire_date
?:指定會(huì)話何時(shí)到期的日期時(shí)間。但是,過(guò)期的會(huì)話對(duì)用戶不可用,但在運(yùn)行 clearsessions 管理命令之前,它們?nèi)钥赡艽鎯?chǔ)在數(shù)據(jù)庫(kù)中。classmethod get_session_store_class()
?:返回要與此會(huì)話模型一起使用的會(huì)話存儲(chǔ)類。get_decoded()
?:返回解碼的會(huì)話數(shù)據(jù)。解碼由會(huì)話存儲(chǔ)類執(zhí)行。還可以通過(guò)子類 ?BaseSessionManager
?自定義模型管理器。
encode(session_dict)
?:返回序列化并編碼為字符串的給定會(huì)話字典。編碼由綁定到模型類的會(huì)話存儲(chǔ)類執(zhí)行。save(session_key, session_dict, expire_date)
?:為提供的會(huì)話密鑰保存會(huì)話數(shù)據(jù),或在數(shù)據(jù)為空時(shí)刪除會(huì)話。通過(guò)重寫以下描述的方法和屬性,實(shí)現(xiàn)了 ?SessionStore
?類的定制:
實(shí)現(xiàn)數(shù)據(jù)庫(kù)支持的會(huì)話存儲(chǔ)
classmethod get_model_class()
?:如果需要的話,重寫此方法以返回自定義會(huì)話模型。create_model_instance(data)
?:返回會(huì)話模型對(duì)象的新實(shí)例,該實(shí)例表示當(dāng)前會(huì)話狀態(tài)。重寫此方法提供了在將會(huì)話模型數(shù)據(jù)保存到數(shù)據(jù)庫(kù)之前修改它的能力。實(shí)現(xiàn)緩存數(shù)據(jù)庫(kù)支持的會(huì)話存儲(chǔ)
cache_key_prefix
?:添加到會(huì)話鍵中以生成緩存鍵字符串的前綴。下面的示例顯示了一個(gè)自定義數(shù)據(jù)庫(kù)支持的會(huì)話引擎,它包括一個(gè)用于存儲(chǔ)帳戶id的附加數(shù)據(jù)庫(kù)列(從而提供了一個(gè)選項(xiàng),用于查詢數(shù)據(jù)庫(kù)中帳戶的所有活動(dòng)會(huì)話):
from django.contrib.sessions.backends.db import SessionStore as DBStore
from django.contrib.sessions.base_session import AbstractBaseSession
from django.db import models
class CustomSession(AbstractBaseSession):
account_id = models.IntegerField(null=True, db_index=True)
@classmethod
def get_session_store_class(cls):
return SessionStore
class SessionStore(DBStore):
@classmethod
def get_model_class(cls):
return CustomSession
def create_model_instance(self, data):
obj = super().create_model_instance(data)
try:
account_id = int(data.get('_auth_user_id'))
except (ValueError, TypeError):
account_id = None
obj.account_id = account_id
return obj
如果要從Django的內(nèi)置 ?cached_db
?會(huì)話存儲(chǔ)遷移到基于?cached_db
?的自定義存儲(chǔ),則應(yīng)重寫緩存鍵前綴,以防止名稱空間沖突:
class SessionStore(CachedDBStore):
cache_key_prefix = 'mysessions.custom_cached_db_backend'
# ...
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: