一、權限實例
在閱讀本文之前請先參考django rest framework 之 認證 中關于 django rest framework 的相關內容及實例
1、目錄結構
為了更好的管理各個功能組件,在django rest framework 之 認證 中我們說到可以將認證類單獨的拿出來,放到其他目錄下,然后導入到 views.py 文件中,在權限環節我們亦可以這么做,目錄結構就變成這樣

在api這個app下創建一個utils包專門用來存放相關的組件。
2、為模型類添加認證字段
我們在models.py中定義了兩個模型類,分別是
from django.db import modelsclass UserInfo(models.Model): USER_TYPE = ( (1,'普通用戶'), (2,'VIP'), (3,'SVIP') ) user_type = models.IntegerField(choices=USER_TYPE, default=1) username = models.CharField(max_length=32) password = models.CharField(max_length=64)class UserToken(models.Model): user = models.OneToOneField(UserInfo,on_delete=models.CASCADE) token = models.CharField(max_length=64)
在 UserInfo 中通過為用戶添加一個 user_type 字段來保證用戶的身份,是普通用戶,VIP還是SVIP,這樣就可以通過用戶的身份驗證不同的權限。如果想要定義一個視圖類,這個類中的邏輯只有超級用戶才能訪問。
3、具體權限認證
可以再utils中的 permissions.py 中這么寫
# utils/permission.pyclass SVIPPremission(object): message = "必須是SVIP才能訪問" # 這里的message表示如果不通過權限的時候,錯誤提示信息 def has_permission(self,request,view): if request.user.user_type != 3: return False return Trueclass MyPremission(object): # 這個權限類表示當用戶為SVIP時不可通過 def has_permission(self,request,view): if request.user.user_type == 3: return False return True
這里只是判斷用戶的 USER_TYPE 的字段,判斷用戶是否有權限,也可以添加其他的邏輯進行判斷。
4、全局配置
在上一節的django rest framework 之 認證 的認證中,將認證類放到了 settings.py 文件中,這樣會作用到視圖中的每一個視圖類,如果視圖類想要自己進行認證,只需要重寫 authentication_classes 即可,那么對于權限來說我們也可以這么做,
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ['api.utils.authenticate.FirstAuthenticate', 'api.utils.authenticate.MyAuthenticate'], "UNAUTHENTICATED_USER": None, # 匿名,request.user = None "UNAUTHENTICATED_TOKEN": None,# 匿名,request.auth = None "DEFAULT_PERMISSION_CLASSES": ['api.utils.permission.MyPermission'], # 表示每一個視圖類(只要不重寫permission_classes屬性),都需要SVIP的用戶才能訪問。}
新聞熱點
疑難解答