【Django】有关多用户管理的一点小经验分享
前言
最近,笔者因为需要开发一个系统作为毕设的展示,因此就产生了有关多用户管理的问题。在这里我把自己的需求重新阐明一下:能够通过Django自带的用户管理框架,实现多用户的管理,例如登录、登出、session、有效期等管理。
翻看很多同行写的文章,发现有关Django的多用户开发很多都含糊其词。主要原因是因为Django的django-admin框架的用户管理要么是用其自带的User类作为用户管理类,要么是自定义用户类别,并继承AbstractUser类。但是,无法实现两个或者多个类同时继承AbstractUser类,并且在settings.py文件中,AUTH_USER_MODEL也仅仅允许添加一个类。因此为了达到我们能够实现的需求,我有如下的设计思想,这个思想在后续的实践中证明可行。
实现
假设有用户类型A和用户类型B两中用户。
Step1:定义一个User类,使其继承AbstractUser类。
class User(AbstractUser):
is_type1 = models.BooleanField(default=False)
is_type2 = models.BooleanField(default=False)
# 这里添加三类用户的除Django-admin框架的User类属性外的额外属性
# 比如姓名
name = models.CharField(max_length=100)
通过上面的代码,可以清楚的看到,User类中设置一个布尔标志,来对用户角色加以区分。
这样设计的好处就是将不同类型的用户进行了统一化。
Step2:定义用户类型1的用户类和用户类型2的用户类
#这里是用户类型1的定义
class User_Type_1(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
# 一类用户的特有属性
user_type_1_teyoushuxing = models.CharField(max_length=200)
class Meta:
db_table = 'tb_user_type_1' # 修改表名
verbose_name = '第一类用户管理' # 管理系统后台显示名称
verbose_name_plural = verbose_name # 后台显示
#这里是用户类型2的定义
class User_Type_2(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
# 二类用户的特有属性
user_type_2_teyoushuxing = models.CharField(max_length=200)
class Meta:
db_table = 'tb_user_type_2' # 修改表名
verbose_name = '第二类用户管理' # 管理系统后台显示名称
verbose_name_plural = verbose_name # 后台显示
我们可以看到,通过代码
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
将User和两类用户进行了绑定,这样做我们就实现了对User的一个扩展,同时实现了不同用户之前的互不干扰。
Step3:在注册创建用户时
# 创建用户
try:
user = User.objects.create_user(
username=username,
password=password,
name=name
)
usertype_1 = User_Type_1.objects.create(user=user, user_type_1_teyoushuxing=user_type_1_teyoushuxing)
except DatabaseError as e:
logger.error(e)
return HttpResponseBadRequest('注册失败')
Step4:在登录用户时
from django.contrib.auth import authenticate
# 默认认证方法是针对username字段进行用户名的判断
user = authenticate(username=username, password=password)
if user is None:
return HttpResponseBadRequest('用户名或者密码错误')
直接使用内置的authenticate获取用户即可,然后根据扩展属性名来获取扩展的特有属性即可。
【Django】有关多用户管理的一点小经验分享的更多相关文章
- gulp+webpack+angular1的一点小经验(第二部分webpack包起来的angular1)
又一周过去了,项目也已经做得有点模样了.收集来一些小经验,分享给大家,有疏漏之处,还望指正,海涵. 上周整合了gulp与webpack,那么工具准备差不多了,我们就开始编码吧.编码的框架就是angul ...
- 模仿下拉框datalist的jquery插件的一点小经验
原本项目里是用h5的新属性data-list,但是这个下拉框的数据太多,而data-list似乎没有设置高度的地方,所以写了个小插件,期间也发现了一些bug,目前这个版本算是可以一用的版本,故写一下这 ...
- gulp+webpack+angular1的一点小经验(第一部分gulp与webpack的整合)
时间匆匆如流水继上周熟悉了gulp的初步安装与环境配置以后,我的项目又进入了新的阶段! 这篇文章将把我这一周遇到的一些问题,以及解决的方式做一个小小的总结,不一定记的完整,但都是个人的一点经验,分享给 ...
- Web应用程序并发问题处理的一点小经验
在web应用中,一个账户,会有N多个涉及到数字的字段.比如一个账户的金额,积分等.这些字段就涉及到增减的情况.如果是在测试环境下,靠程序员或者测试手动点击.一般是发现不了问题. 一旦上到正式环境下.有 ...
- gulp+webpack+angular1的一点小经验(第三部分使用一些angular1的插件ui-bootstrap与highcharts)
第一个要介绍的是我们的麻烦制造器:angular-ui-bootstrap ui-bootstrap可以有很多通用的插件给大家用,比如弹窗啊(modal),翻页控件啊(pagination),为什么说 ...
- iOS 内存管理的一点小问题
现在大家的项目应该基本都是ARC了,如果还是MRC的话,赶紧转换到ARC吧!最近被临时拉过去开发iPad,由于项目原因,还是使用的MRC.今天在调部分界面的时候,发现一段代码,我怎么看都怎么觉得怪怪的 ...
- Global一点小经验
Global: Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法,他位于应用程序根目录下. 这个 Global.asax ...
- KInect AR沙盒制作的一点小经验
最近在微博上看到这样一条 微博 >点这看< 看起来非常有意思,就去Google了一下如何制作. 没想到这是一个开源项目,而且还告诉你如何安装 OK,接下来就说说我的制作过程. 首先,先放 ...
- 关于前端js拼接字符串的一点小经验
1.今天在做项目的时候遇到一个问题,就是使用onclick="xxx()" 点击事件的时候,参数如果为全数字就会出现点击无反应的问题.但是当参数为字符串或者动态内容的时候就会出现 ...
随机推荐
- Angular 8.x in Action
Angular 8.x in Action web fullstack / fullstack web Angular 8 https://angular.io/ Angular 2, Angular ...
- flutter 让app跟随系统的theme
首先你需要在"MaterialApp"设置两套theme MaterialApp( theme: myTheme, // light darkTheme: ThemeData.da ...
- bowser checker & UA
bowser checker & UA navigator.userAgent; https://developer.mozilla.org/en-US/docs/Web/HTTP/Brows ...
- 星盟全球投资副总裁DENIEL SOIBIM:如何激发创造力
丹尼尔·索比姆毕业于加州理工大学,2005年通过创建投资俱乐部对潜力公司进行天使投资,获得了美国Blue Run高层的重视,任营收专家评估师,为Blue Run项目提案做风险评估,09年与泰勒·亚当斯 ...
- java数据类型(基础篇)
public class note02 { public static void main(String[] args) { //八大基本数据类型 //1.整数 byte num1 = 1; shor ...
- WLAN-AC+AP射频一劳永逸的调优方式
AP射频调优组网图 射频调优简介 射频调优的主要功能就是动态调整AP的信道和功率,可以使同一AC管理的各AP的信道和功率保持相对平衡,保证AP工作在最佳状态.WLAN网络中,AP的工作状态会受到周围环 ...
- 开启算法之路,还原题目,用debug调试搞懂每一道题
文章简述 大家好,本篇是个人的第 3 篇文章. 承接第一篇文章<手写单链表基础之增,删,查!附赠一道链表题>,在第一篇文章中提过,在刷算法题之前先将基础知识过一遍,这样对后面的做算法题是很 ...
- java基础第12期——反射、注解
一. 反射 反射: 将类的各个组成部分封装为其他对象. 1.1 获取class对象的方式 Class.forName("全类名"): 将字节码文件加载进内存,返回class对象 多 ...
- eclipse快速定位当前类所在位置
如何快速的找到一个类并且定位它所在的位置呢?这里以搜索Menu类为例说明. 可以通过CTRL + SHIFT +R的组合键,输入Menu 双击Menu.java即可跳转到对应的类上,但此时还不知道此类 ...
- JVM相关 - 深入理解 System.gc()
本文基于 Java 17-ea,但是相关设计在 Java 11 之后是大致一样的 我们经常在面试中询问 System.gc() 究竟会不会立刻触发 Full GC,网上也有很多人给出了答案,但是这些答 ...