最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django處理多用戶類型的方法介紹

 更新時間:2019年05月18日 09:38:46   作者:棲遲于一丘  
這篇文章主要給大家介紹了關(guān)于Django處理多用戶類型的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Django具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

起步

這是許多開發(fā)者在項目初期要面臨的一個普遍問題。要怎樣來處理多用戶類型。

本文講介紹對于不同場景和業(yè)務(wù)需求如何設(shè)計用戶模型。為項目提供指導(dǎo)設(shè)計。

設(shè)計之前

在梳理用戶設(shè)計之前,有幾個前提需要遵守。

1. 不要使用 Django 內(nèi)置的 User 模型,盡管它能滿足應(yīng)用程序的所有要求。

正如官方Django文檔強烈建議為新項目使用自定義用戶模型。需求總是在變,只用固定的模型不太現(xiàn)實,并且一旦設(shè)置了 AUTH_USER_MODEL 后續(xù)再修改就很麻煩了。

2.無論最后選擇什么方案,無論有什么業(yè)務(wù),都始終只使用一個 Django 模型來處理身份驗證。

永遠(yuǎn)都使用一個用戶模型,這就是標(biāo)題為什么是處理多用戶類型而不是多用戶模型。這也就能使用統(tǒng)一的身份認(rèn)證機制。它仍然可以擁有多種用戶類型。

方案

不同的項目要求設(shè)計出來的方案也是不同的,不妨先問問自己這幾個問題:

  • 需要維護多少種用戶類型?
  • 用戶可以同時擁有多種角色嗎?比如用戶可以同時成為學(xué)生或老師嗎?
  • 不同用戶類型是否需要存儲不同的信息?

一種非常常見的情況就是擁有普通用戶和管理員。在這種場景下,可以使用內(nèi)置的 is_staff 來區(qū)分普通用戶和管理員。實際上,內(nèi)置模型中有兩個字段來處理這種情況:is_staff 和 is_superuser 。is_staff 標(biāo)志著用戶是否允許登錄 Django Admin 頁面,至于該用戶能做什么或不能做什么,就由權(quán)限框架來授權(quán)。而 is_superuser 是一個額外的標(biāo)志,意味著擁有所有權(quán)限。所以這里可以看出來,權(quán)限有兩個級別的管理。

需要維護多少種用戶類型? 如果類型數(shù)量比較少,那就可以效仿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 種類型可以選擇這種方式。

用戶可以同時擁有多種角色嗎?

如果用戶是可以同時承擔(dān)多種角色的話,那么就需要一個額外的表表示它們多對多的關(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)

這種方案其實并不常見,因為Django已經(jīng)提供權(quán)限組的功能并擁有靈活的權(quán)限管理。你得評估下創(chuàng)建自定義權(quán)限組是否更好。

不同用戶類型是否需要存儲不同的信息? 如果存儲的信息(如頭像)與所有用戶相關(guān),那么最好的做法就是直接向用戶模型添加額外的字段。

如果儲存的信息只與特定的類型用戶有關(guān),那么可以用 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)
  ...

總結(jié)

可以參照如下的流程圖來幫助設(shè)計:

總的來說,始終都用一個用戶模型來處理身份認(rèn)證,不要在多有模型中存儲用戶名和密碼。通常對 User 模型添加布爾標(biāo)記位就能適應(yīng)大多數(shù)情況。如果需要靈活的權(quán)限管理,可以使用Django內(nèi)置的權(quán)限框架或第三方庫。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Python使用Selenium+BeautifulSoup爬取淘寶搜索頁

    Python使用Selenium+BeautifulSoup爬取淘寶搜索頁

    這篇文章主要為大家詳細(xì)介紹了Python使用Selenium+BeautifulSoup爬取淘寶搜索頁,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • python實現(xiàn)基于樸素貝葉斯的垃圾分類算法

    python實現(xiàn)基于樸素貝葉斯的垃圾分類算法

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)基于樸素貝葉斯的垃圾分類算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 創(chuàng)建SparkSession和sparkSQL的詳細(xì)過程

    創(chuàng)建SparkSession和sparkSQL的詳細(xì)過程

    SparkSession 是 Spark SQL 的入口,Builder 是 SparkSession 的構(gòu)造器。 通過 Builder, 可以添加各種配置,并通過 stop 函數(shù)來停止 SparkSession,本文給大家分享創(chuàng)建SparkSession和sparkSQL的詳細(xì)過程,一起看看吧
    2021-08-08
  • tensorflow實現(xiàn)讀取模型中保存的值 tf.train.NewCheckpointReader

    tensorflow實現(xiàn)讀取模型中保存的值 tf.train.NewCheckpointReader

    今天小編就為大家分享一篇tensorflow實現(xiàn)讀取模型中保存的值 tf.train.NewCheckpointReader,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python zip,lambda,map函數(shù)代碼實例

    python zip,lambda,map函數(shù)代碼實例

    這篇文章主要介紹了python zip,lambda,map函數(shù)代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 利用Python2下載單張圖片與爬取網(wǎng)頁圖片實例代碼

    利用Python2下載單張圖片與爬取網(wǎng)頁圖片實例代碼

    這篇文章主要給大家介紹了關(guān)于利用Python2下載單張圖片與爬取網(wǎng)頁圖片的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • python3 使用ssh隧道連接mysql的操作

    python3 使用ssh隧道連接mysql的操作

    這篇文章主要介紹了python3 使用ssh隧道連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Python中的賦值、淺拷貝、深拷貝介紹

    Python中的賦值、淺拷貝、深拷貝介紹

    這篇文章主要介紹了Python中的賦值、淺拷貝、深拷貝介紹,Python中也分為簡單賦值、淺拷貝、深拷貝這幾種“拷貝”方式,需要的朋友可以參考下
    2015-03-03
  • python開發(fā)之IDEL(Python GUI)的使用方法圖文詳解

    python開發(fā)之IDEL(Python GUI)的使用方法圖文詳解

    這篇文章主要介紹了python開發(fā)之IDEL(Python GUI)的使用方法,結(jié)合圖文形式較為詳細(xì)的分析總結(jié)了Python GUI的具體使用方法,需要的朋友可以參考下
    2015-11-11
  • Python openpyxl模塊原理及用法解析

    Python openpyxl模塊原理及用法解析

    這篇文章主要介紹了Python openpyxl模塊原理及用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01

最新評論

垫江县| 新疆| 黄梅县| 务川| 大竹县| 九寨沟县| 临汾市| 和龙市| 洛隆县| 突泉县| 苗栗市| 梓潼县| 南靖县| 天祝| 崇仁县| 铜川市| 宁津县| 台安县| 咸阳市| 正宁县| 青州市| 安化县| 乌什县| 正阳县| 桐乡市| 侯马市| 灵石县| 肃北| 咸丰县| 介休市| 芷江| 芦溪县| 汕尾市| 尼木县| 普兰县| 南开区| 墨江| 元朗区| 平安县| 临澧县| 定州市|