Django4 中文入门教程 Django4.0 使用会话-扩展数据库支持的会话引擎

2024-02-25 开发教程 Django4 中文入门教程 匿名 3

可以通过继承 ​AbstractBaseSession ​和 ​SessionStore​类来创建基于Django中包含的自定义数据库支持的会话引擎(即 ​db ​和 ​cached_db ​)。

AbstractBaseSession ​和 ​BaseSessionManager ​可以从 ​django.contrib.sessions.base_session导入,因此它们可以在 ​INSTALLED_APPS ​不包含 ​django.contrib.sessions​ 的情况下导入。

class base_session.AbstractBaseSession

抽象基本会话模型

  • session_key​:主键。字段本身可能包含多达40个字符。当前实现生成一个32个字符的字符串(一个随机的数字序列和小写的ascii字母)。
  • session_data​:包含编码和序列化会话字典的字符串。
  • expire_date​:指定会话何时到期的日期时间。但是,过期的会话对用户不可用,但在运行 clearsessions 管理命令之前,它们仍可能存储在数据库中。
  • classmethod get_session_store_class()​:返回要与此会话模型一起使用的会话存储类。
  • get_decoded()​:返回解码的会话数据。解码由会话存储类执行。

还可以通过子类 ​BaseSessionManager ​自定义模型管理器。

class base_session.BaseSessionManager

  • encode(session_dict)​:返回序列化并编码为字符串的给定会话字典。编码由绑定到模型类的会话存储类执行。
  • save(session_key, session_dict, expire_date)​:为提供的会话密钥保存会话数据,或在数据为空时删除会话。

通过重写以下描述的方法和属性,实现了 ​SessionStore ​类的定制:

class backends.db.SessionStore

实现数据库支持的会话存储

  • classmethod get_model_class()​:如果需要的话,重写此方法以返回自定义会话模型。
  • create_model_instance(data)​:返回会话模型对象的新实例,该实例表示当前会话状态。重写此方法提供了在将会话模型数据保存到数据库之前修改它的能力。

class backends.cached_db.SessionStore

实现缓存数据库支持的会话存储

  • cache_key_prefix​:添加到会话键中以生成缓存键字符串的前缀。

例如

下面的示例显示了一个自定义数据库支持的会话引擎,它包括一个用于存储帐户id的附加数据库列(从而提供了一个选项,用于查询数据库中帐户的所有活动会话):

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的内置 ​cached_db ​会话存储迁移到基于​cached_db ​的自定义存储,则应重写缓存键前缀,以防止名称空间冲突:

class SessionStore(CachedDBStore):
cache_key_prefix = 'mysessions.custom_cached_db_backend'
# ...