Django處理多用戶類型的方法介紹
起步
這是許多開發(fā)者在項(xiàng)目初期要面臨的一個(gè)普遍問題。要怎樣來處理多用戶類型。
本文講介紹對于不同場景和業(yè)務(wù)需求如何設(shè)計(jì)用戶模型。為項(xiàng)目提供指導(dǎo)設(shè)計(jì)。
設(shè)計(jì)之前
在梳理用戶設(shè)計(jì)之前,有幾個(gè)前提需要遵守。
1. 不要使用 Django 內(nèi)置的 User 模型,盡管它能滿足應(yīng)用程序的所有要求。
正如官方Django文檔強(qiáng)烈建議為新項(xiàng)目使用自定義用戶模型。需求總是在變,只用固定的模型不太現(xiàn)實(shí),并且一旦設(shè)置了 AUTH_USER_MODEL 后續(xù)再修改就很麻煩了。
2.無論最后選擇什么方案,無論有什么業(yè)務(wù),都始終只使用一個(gè) Django 模型來處理身份驗(yàn)證。
永遠(yuǎn)都使用一個(gè)用戶模型,這就是標(biāo)題為什么是處理多用戶類型而不是多用戶模型。這也就能使用統(tǒng)一的身份認(rèn)證機(jī)制。它仍然可以擁有多種用戶類型。
方案
不同的項(xiàng)目要求設(shè)計(jì)出來的方案也是不同的,不妨先問問自己這幾個(gè)問題:
- 需要維護(hù)多少種用戶類型?
- 用戶可以同時(shí)擁有多種角色嗎?比如用戶可以同時(shí)成為學(xué)生或老師嗎?
- 不同用戶類型是否需要存儲(chǔ)不同的信息?
一種非常常見的情況就是擁有普通用戶和管理員。在這種場景下,可以使用內(nèi)置的 is_staff 來區(qū)分普通用戶和管理員。實(shí)際上,內(nèi)置模型中有兩個(gè)字段來處理這種情況:is_staff 和 is_superuser 。is_staff 標(biāo)志著用戶是否允許登錄 Django Admin 頁面,至于該用戶能做什么或不能做什么,就由權(quán)限框架來授權(quán)。而 is_superuser 是一個(gè)額外的標(biāo)志,意味著擁有所有權(quán)限。所以這里可以看出來,權(quán)限有兩個(gè)級別的管理。
需要維護(hù)多少種用戶類型? 如果類型數(shù)量比較少,那就可以效仿Django的方式,用幾個(gè)字段來簡單表示:
class User(AbstractUser): is_student = models.BooleanField(default=False) is_teacher = models.BooleanField(default=False)
這可能是處理多種用戶類型最簡單的方法了。
另一種選擇是,只用一個(gè)字段就來表示用戶:
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 種類型可以選擇這種方式。
用戶可以同時(shí)擁有多種角色嗎?
如果用戶是可以同時(shí)承擔(dān)多種角色的話,那么就需要一個(gè)額外的表表示它們多對多的關(guān)系,顯然可以用到 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)
這種方案其實(shí)并不常見,因?yàn)镈jango已經(jīng)提供權(quán)限組的功能并擁有靈活的權(quán)限管理。你得評估下創(chuàng)建自定義權(quán)限組是否更好。
不同用戶類型是否需要存儲(chǔ)不同的信息? 如果存儲(chǔ)的信息(如頭像)與所有用戶相關(guān),那么最好的做法就是直接向用戶模型添加額外的字段。
如果儲(chǔ)存的信息只與特定的類型用戶有關(guān),那么可以用 OneToOneField 來進(jìn)行拓展:
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) ...
總結(jié)
可以參照如下的流程圖來幫助設(shè)計(jì):
總的來說,始終都用一個(gè)用戶模型來處理身份認(rèn)證,不要在多有模型中存儲(chǔ)用戶名和密碼。通常對 User 模型添加布爾標(biāo)記位就能適應(yīng)大多數(shù)情況。如果需要靈活的權(quán)限管理,可以使用Django內(nèi)置的權(quán)限框架或第三方庫。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。
相關(guān)文章
python人工智能tensorflow函數(shù)tf.layers.dense使用方法
這篇文章主要介紹了python人工智能tensorflow函數(shù)tf.layers.dense的使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-0510個(gè)必須要掌握的Python內(nèi)置函數(shù)
Python?解釋器自帶的函數(shù)叫做?內(nèi)置函數(shù),這些函數(shù)不需要import?導(dǎo)入就可以直接使用。本文小編為大家總結(jié)了十個(gè)必須要掌握的Python內(nèi)置函數(shù),實(shí)用且高效,需要的可以參考一下2022-02-02python實(shí)現(xiàn)分析apache和nginx日志文件并輸出訪客ip列表的方法
這篇文章主要介紹了python實(shí)現(xiàn)分析apache和nginx日志文件并輸出訪客ip列表的方法,涉及Python操作日志文件的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04pyqt5 從本地選擇圖片 并顯示在label上的實(shí)例
今天小編就為大家分享一篇pyqt5 從本地選擇圖片 并顯示在label上的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06