您的位置:58脚本 > django扩展user Django4.0 使用会话-扩展数据库支持的会话引擎

django扩展user Django4.0 使用会话-扩展数据库支持的会话引擎

2023-03-22 07:32 Django4中文教程

django扩展user Django4.0 使用会话-扩展数据库支持的会话引擎

django扩展user

Django扩展user是一种技术,它可以帮助开发者在Django框架中扩展用户模型。它允许开发者在Django的内置用户模型上进行自定义,以便能够根据应用程序的需要来存储额外的信息。

使用Django扩展user的优势在于,它可以帮助开发者快速创建一个安全、可靠的用户体系。此外,它还能够帮助开发者节省时间,因为不必重新创建一个新的用户体系。

from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):  # 继承AbstractUser
    age = models.IntegerField(null=True, blank=True)  # 新增字段age
    gender = models.CharField(max_length=10, null=True, blank=True)  # 新增字段gender

使用Django扩展user时,首先要创建一个新的自定义用户类,该类将从django.contrib.auth.models中导入AbstractUser。然后,在该类中新增想要存储的信息字段(如上例中的age、gender字段)。最后,将该自定义用户类注册到settings.py文件中即可。

Django4.0 使用会话-扩展数据库支持的会话引擎

可以通过继承 ​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"

    # ...


阅读全文
以上是58脚本为你收集整理的django扩展user Django4.0 使用会话-扩展数据库支持的会话引擎全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 58脚本 58jiaoben.com 版权所有 联系我们
桂ICP备12005667号-28 Powered by CMS