zoukankan      html  css  js  c++  java
  • 【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获取用户即可,然后根据扩展属性名来获取扩展的特有属性即可。

    前进,前进,不择手段地前进!
  • 相关阅读:
    创业公司技术总监,去上市公司面试,结果凉了!
    Java开发最常犯的10个错误,打死都不要犯!
    这 17 个 JVM 参数,高级 Java 必须掌握!
    推荐几个顶级的IT技术公众号,坐稳了!
    Spring Boot 面试,一个问题就干趴下了!(下)
    密码已进入"淘汰"倒计时!
    一条简单的 SQL 执行超过1000ms,纳尼?
    天天用Synchronized,底层原理是个啥?
    为什么很多程序员工作时都戴耳机?
    Java转型大数据开发全套教程,都在这儿!
  • 原文地址:https://www.cnblogs.com/nfuquan/p/14618549.html
Copyright © 2011-2022 走看看