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文件中即可。
可以通过继承 AbstractBaseSession
和 SessionStore
类来创建基于Django中包含的自定义数据库支持的会话引擎(即 db
和 cached_db
)。
AbstractBaseSession
和 BaseSessionManager
可以从 django.contrib.sessions.base_session
导入,因此它们可以在 INSTALLED_APPS
不包含 django.contrib.sessions
的情况下导入。
抽象基本会话模型
session_key
:主键。字段本身可能包含多达40个字符。当前实现生成一个32个字符的字符串(一个随机的数字序列和小写的ascii字母)。session_data
:包含编码和序列化会话字典的字符串。expire_date
:指定会话何时到期的日期时间。但是,过期的会话对用户不可用,但在运行 clearsessions 管理命令之前,它们仍可能存储在数据库中。classmethod get_session_store_class()
:返回要与此会话模型一起使用的会话存储类。get_decoded()
:返回解码的会话数据。解码由会话存储类执行。还可以通过子类 BaseSessionManager
自定义模型管理器。
encode(session_dict)
:返回序列化并编码为字符串的给定会话字典。编码由绑定到模型类的会话存储类执行。save(session_key, session_dict, expire_date)
:为提供的会话密钥保存会话数据,或在数据为空时删除会话。通过重写以下描述的方法和属性,实现了 SessionStore
类的定制:
实现数据库支持的会话存储
classmethod get_model_class()
:如果需要的话,重写此方法以返回自定义会话模型。create_model_instance(data)
:返回会话模型对象的新实例,该实例表示当前会话状态。重写此方法提供了在将会话模型数据保存到数据库之前修改它的能力。实现缓存数据库支持的会话存储
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"
# ...
一旦你定义了你的模型,你需要告诉 Django 你准备 使用 这些模型。你需要修改设置文件中的 INSTALLED_APPS,在这个设置...
Java Swing教程 -Java Swing工具包我们可以使用java.awt.Toolkit与本机工具包系统进行通信。Toolkit类提供了一个静态getDefaultT...
MyBatis-Plus 条件构造器-AbstractWrapperin(R column, Collection? value)in(boolean condition, R column, Collection? value)...
基于 Java 的配置到目前为止,你已经看到如何使用 XML 配置文件来配置 Spring bean。如果你熟悉使用 XML 配置,那么我会说,不需...
sql:query 标签 sql:query标签用来运行SQL SELECT语句,还有就是将结果存储在作用域变量中。属性 sql:query标签有如下属性:...
fmt:setBundle 标签 fmt:setBundle标签用来载入一个资源束,然后将它存储在作用域中已命名的变量或bundle配置变量中。语法格式fm...
x:choose, x:when, x:otherwise 标签 x:choose标签与Java switch语句有相同的功能。switch语句有case语句,而x:choose标签有x:wh...
Swift教程 -Swift开关语句 switch 语句用于根据a的值执行代码 变量。例子var shape = 1switch shape {case 0:println("0")case 1...