前言
最近,筆者因為需要開發一個系統作為畢設的展示,因此就產生了有關多用戶管理的問題。在這里我把自己的需求重新闡明一下:能夠通過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獲取用戶即可,然后根據擴展屬性名來獲取擴展的特有屬性即可。