Django处理多用户类型的方法介绍


Posted in Python onMay 18, 2019

起步

这是许多开发者在项目初期要面临的一个普遍问题。要怎样来处理多用户类型。

本文讲介绍对于不同场景和业务需求如何设计用户模型。为项目提供指导设计。

设计之前

在梳理用户设计之前,有几个前提需要遵守。

1. 不要使用 Django 内置的 User 模型,尽管它能满足应用程序的所有要求。

正如官方Django文档强烈建议为新项目使用自定义用户模型。需求总是在变,只用固定的模型不太现实,并且一旦设置了 AUTH_USER_MODEL 后续再修改就很麻烦了。

2.无论最后选择什么方案,无论有什么业务,都始终只使用一个 Django 模型来处理身份验证。

永远都使用一个用户模型,这就是标题为什么是处理多用户类型而不是多用户模型。这也就能使用统一的身份认证机制。它仍然可以拥有多种用户类型。

方案

不同的项目要求设计出来的方案也是不同的,不妨先问问自己这几个问题:

  • 需要维护多少种用户类型?
  • 用户可以同时拥有多种角色吗?比如用户可以同时成为学生或老师吗?
  • 不同用户类型是否需要存储不同的信息?

一种非常常见的情况就是拥有普通用户和管理员。在这种场景下,可以使用内置的 is_staff 来区分普通用户和管理员。实际上,内置模型中有两个字段来处理这种情况:is_staff 和 is_superuser 。is_staff 标志着用户是否允许登录 Django Admin 页面,至于该用户能做什么或不能做什么,就由权限框架来授权。而 is_superuser 是一个额外的标志,意味着拥有所有权限。所以这里可以看出来,权限有两个级别的管理。

需要维护多少种用户类型? 如果类型数量比较少,那就可以效仿Django的方式,用几个字段来简单表示:

class User(AbstractUser):
  is_student = models.BooleanField(default=False)
  is_teacher = models.BooleanField(default=False)

这可能是处理多种用户类型最简单的方法了。

另一种选择是,只用一个字段就来表示用户:

class User(AbstractUser):
 USER_TYPE_CHOICES = (
   (1, 'student'),
   (2, 'teacher'),
   (3, 'secretary'),
   (4, 'supervisor'),
   (5, 'admin'),
 )

 user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES)

超过 3 种类型可以选择这种方式。

用户可以同时拥有多种角色吗?

如果用户是可以同时承担多种角色的话,那么就需要一个额外的表表示它们多对多的关系,显然可以用到 ManyToManyField :

class Role(models.Model):
 '''
 The Role entries are managed by the system,
 automatically created via a Django data migration.
 '''
 STUDENT = 1
 TEACHER = 2
 SECRETARY = 3
 SUPERVISOR = 4
 ADMIN = 5
 ROLE_CHOICES = (
   (STUDENT, 'student'),
   (TEACHER, 'teacher'),
   (SECRETARY, 'secretary'),
   (SUPERVISOR, 'supervisor'),
   (ADMIN, 'admin'),
 )

 id = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, primary_key=True)

 def __str__(self):
   return self.get_id_display()

class User(AbstractUser):
 roles = models.ManyToManyField(Role)

这种方案其实并不常见,因为Django已经提供权限组的功能并拥有灵活的权限管理。你得评估下创建自定义权限组是否更好。

不同用户类型是否需要存储不同的信息? 如果存储的信息(如头像)与所有用户相关,那么最好的做法就是直接向用户模型添加额外的字段。

如果储存的信息只与特定的类型用户有关,那么可以用 OneToOneField 来进行拓展:

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
  is_student = models.BooleanField(default=False)
  is_teacher = models.BooleanField(default=False)

class Student(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
  ...

class Teacher(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
  ...

总结

可以参照如下的流程图来帮助设计:

Django处理多用户类型的方法介绍

总的来说,始终都用一个用户模型来处理身份认证,不要在多有模型中存储用户名和密码。通常对 User 模型添加布尔标记位就能适应大多数情况。如果需要灵活的权限管理,可以使用Django内置的权限框架或第三方库。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python求pi的方法
Oct 08 Python
Python解决鸡兔同笼问题的方法
Dec 20 Python
初步认识Python中的列表与位运算符
Oct 12 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
python写入并获取剪切板内容的实例
May 31 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
Jan 08 Python
Python解决pip install时出现的Could not fetch URL问题
Aug 01 Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
Feb 05 Python
vscode配置anaconda3的方法步骤
Aug 08 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
Django 配置多站点多域名的实现步骤
May 17 #Python
将Python字符串生成PDF的实例代码详解
May 17 #Python
Python Django框架单元测试之文件上传测试示例
May 17 #Python
Python django框架应用中实现获取访问者ip地址示例
May 17 #Python
Python Django框架实现应用添加logging日志操作示例
May 17 #Python
Python实现通过解析域名获取ip地址的方法分析
May 17 #Python
如何用C代码给Python写扩展库(Cython)
May 17 #Python
You might like
提问的智慧
2006/10/09 PHP
模拟xcopy的函数
2006/10/09 PHP
php自定义函数之递归删除文件及目录
2010/08/08 PHP
php入门学习知识点三 PHP上传
2011/07/14 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
纯css实现窗户玻璃雨滴逼真效果
2015/08/23 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
jQuery操作json常用方法示例
2017/01/04 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
python中的迭代和可迭代对象代码示例
2017/12/27 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
2018/09/04 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
Selenium使用Chrome模拟手机浏览器方法解析
2020/04/10 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
计算机专业毕业生推荐信
2013/11/25 职场文书
推荐信格式范文
2014/05/09 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
冰峪沟导游词
2015/02/09 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
POST提交数据常见的四种方式
2022/01/18 HTML / CSS