Django4.0 使用會(huì)話-擴(kuò)展數(shù)據(jù)庫(kù)支持的會(huì)話引擎

2022-03-16 18:01 更新

可以通過(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)入。

class base_session.AbstractBaseSession

抽象基本會(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 ?自定義模型管理器。

class base_session.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 ?類的定制:

class backends.db.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ù)之前修改它的能力。

class backends.cached_db.SessionStore

實(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'

    # ...


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)