Django Rest framework權限的詳細用法
前言
我們都聽過權限,那么權限到底是做什么的呢.
我們都有博客,或者去一些論壇,一定知道管理員這個角色,
比如我們申請博客的時候,一定要向管理員申請,也就是說管理員會有一些特殊的權利,是我們沒有的.
==這些對某件事情決策的范圍和程度,我們叫做權限==,權限是我們在項目開發(fā)中經常用到的.
本文將詳細講述DRF框架為我們提供的權限組件的使用方法.
源碼剖析
DRF的版本控制、認證、權限、頻率組件都在initial方法里初始化.

我們點進去看看:

其實我們版本、認證、權限、頻率控制走的源碼流程大致相同.
==我們的權限類中一定要有has_permission方法——框架為我們提供的鉤子.==
我們再來看看rest_framework.permissions文件中存放的框架為我們提供的所有權限的方法:

==注意圖中的BasePermission類,這個類是框架為我們提供的基礎權限類,我們自定義的權限類都要繼承此類.==
調用方法
在視圖中調用:
permission_classes = ["自定義的權限類", ]
全局調用:
REST_FRAMEWORK = {
# 配置全局認證
'DEFAULT_AUTHENTICATION_CLASSES': ["指定自定義的權限類", ]
}
權限的詳細用法
請結合【DRF認證組件詳細用法】此文獻中的自定義認證類來閱讀如下步驟.
第一步 準備數據庫文件和數據
from django.db import models class UserInfo(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) token = models.UUIDField(null=True, blank=True) user_type = ((1, "普通用戶"), (2, "管理員")) type = models.IntegerField(choices=user_type, default=1)
數據如下:
mysql> select * from blog_userinfo; +----+-----------+-----------+------+-------+ | id | name | pwd | type | token | +----+-----------+-----------+------+-------+ | 1 | 花千骨 | huaqiangu | 1 | NULL | | 2 | 錦覓 | jinmi | 2 | NULL | +----+-----------+-----------+------+-------+ 2 rows in set (0.00 sec)
第二步 自定義一個權限組件
from rest_framework.permissions import BasePermission # 導入基礎的權限類
class MyPermission():
"""必備的屬性和方法,基本固定的邏輯"""
message = "普通用戶無權訪問的數據"
def has_permission(self, request, view):
"""
注意:
源碼中初始化時的順序是認證在前,權限在后,所以只要認證通過
我們這里就可以使用request.user拿到用戶信息,request.auth拿到用戶對象
"""
# 獲取認證控制的返回值
print("用戶名:" request.user)
user_obj = request.auth
if user_obj.type == 1:
return False # 普通用戶
return True # 管理員
第三步 urls.py
from django.conf.urls import url from blog.views import LoginView, TestPermissionView urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/$', LoginView.as_view()), # 用于登陸 url(r'^test_permission/$', TestPermissionView.as_view()), # 用于權限測試 ]
第四步 views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .auth import MyAuth # 導入自定義的認證組件
from .permission import MyPermission # 導入自定義的權限控制組件
from .models import UserInfo # 導入用戶信息表
import uuid # 用于生成uuid
class LoginView(APIView):
"""用于登陸驗證并生成UUID的視圖"""
def post(self, request):
name = request.data.get('name')
pwd = request.data.get('pwd')
user_obj = UserInfo.objects.filter(name=name, pwd=pwd).first()
if user_obj:
u4 = uuid.uuid4() # 生成uuid4
user_obj.token = u4
user_obj.save()
return Response(str(u4))
return Response("用戶名或密碼錯誤")
class TestPermissionView(APIView):
"""用于測試權限的視圖"""
# 在視圖中增加如下屬性,即表明此視圖要走如下組件的邏輯
authentication_classes = [MyAuth, ] # 自定義的認證組件
permission_classes = [MyPermission, ] # 權限控制組件
def get(self, request):
return Response("這里是管理員能訪問的數據")
好了,我們可以測試了.
我們先登陸一個普通用戶:

然后復制返回的UUID,再去訪問權限測試頁面:

可見,返回的內容為普通用戶無權限.
我們再來登陸一個管理員:

然后復制返回的UUID,再去訪問權限測試頁面:

可見,返回的內容為管理員能訪問的數據.
好了,關于DRF的權限就到這里了.
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python自動化測試selenium操作checkbox和radiobox技術
這篇文章主要為大家介紹了python自動化測試selenium核心技術操作checkbox和radiobox的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
python讀取查看npz/npy文件數據以及數據完全顯示方法實例
前兩天從在GitHub下載了一個代碼,其中的數據集是.npz結尾的文件,之前沒有見過不知道如何處理,下面這篇文章主要給大家介紹了關于python讀取查看npz/npy文件數據以及數據完全顯示方法的相關資料,需要的朋友可以參考下2022-04-04
python GUI庫圖形界面開發(fā)之PyQt5窗口類QMainWindow詳細使用方法
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5窗口類QMainWindow詳細使用方法,需要的朋友可以參考下2020-02-02

