Django Rest framework權(quán)限的詳細(xì)用法
前言
我們都聽(tīng)過(guò)權(quán)限,那么權(quán)限到底是做什么的呢.
我們都有博客,或者去一些論壇,一定知道管理員這個(gè)角色,
比如我們申請(qǐng)博客的時(shí)候,一定要向管理員申請(qǐng),也就是說(shuō)管理員會(huì)有一些特殊的權(quán)利,是我們沒(méi)有的.
==這些對(duì)某件事情決策的范圍和程度,我們叫做權(quán)限==,權(quán)限是我們?cè)陧?xiàng)目開(kāi)發(fā)中經(jīng)常用到的.
本文將詳細(xì)講述DRF框架為我們提供的權(quán)限組件的使用方法.
源碼剖析
DRF的版本控制、認(rèn)證、權(quán)限、頻率組件都在initial方法里初始化.

我們點(diǎn)進(jìn)去看看:

其實(shí)我們版本、認(rèn)證、權(quán)限、頻率控制走的源碼流程大致相同.
==我們的權(quán)限類中一定要有has_permission方法——框架為我們提供的鉤子.==
我們?cè)賮?lái)看看rest_framework.permissions文件中存放的框架為我們提供的所有權(quán)限的方法:

==注意圖中的BasePermission類,這個(gè)類是框架為我們提供的基礎(chǔ)權(quán)限類,我們自定義的權(quán)限類都要繼承此類.==
調(diào)用方法
在視圖中調(diào)用:
permission_classes = ["自定義的權(quán)限類", ]
全局調(diào)用:
REST_FRAMEWORK = {
# 配置全局認(rèn)證
'DEFAULT_AUTHENTICATION_CLASSES': ["指定自定義的權(quán)限類", ]
}
權(quán)限的詳細(xì)用法
請(qǐng)結(jié)合【DRF認(rèn)證組件詳細(xì)用法】此文獻(xiàn)中的自定義認(rèn)證類來(lái)閱讀如下步驟.
第一步 準(zhǔn)備數(shù)據(jù)庫(kù)文件和數(shù)據(jù)
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)
數(shù)據(jù)如下:
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)
第二步 自定義一個(gè)權(quán)限組件
from rest_framework.permissions import BasePermission # 導(dǎo)入基礎(chǔ)的權(quán)限類
class MyPermission():
"""必備的屬性和方法,基本固定的邏輯"""
message = "普通用戶無(wú)權(quán)訪問(wèn)的數(shù)據(jù)"
def has_permission(self, request, view):
"""
注意:
源碼中初始化時(shí)的順序是認(rèn)證在前,權(quán)限在后,所以只要認(rèn)證通過(guò)
我們這里就可以使用request.user拿到用戶信息,request.auth拿到用戶對(duì)象
"""
# 獲取認(rèn)證控制的返回值
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()), # 用于權(quán)限測(cè)試 ]
第四步 views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .auth import MyAuth # 導(dǎo)入自定義的認(rèn)證組件
from .permission import MyPermission # 導(dǎo)入自定義的權(quán)限控制組件
from .models import UserInfo # 導(dǎo)入用戶信息表
import uuid # 用于生成uuid
class LoginView(APIView):
"""用于登陸驗(yàn)證并生成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("用戶名或密碼錯(cuò)誤")
class TestPermissionView(APIView):
"""用于測(cè)試權(quán)限的視圖"""
# 在視圖中增加如下屬性,即表明此視圖要走如下組件的邏輯
authentication_classes = [MyAuth, ] # 自定義的認(rèn)證組件
permission_classes = [MyPermission, ] # 權(quán)限控制組件
def get(self, request):
return Response("這里是管理員能訪問(wèn)的數(shù)據(jù)")
好了,我們可以測(cè)試了.
我們先登陸一個(gè)普通用戶:

然后復(fù)制返回的UUID,再去訪問(wèn)權(quán)限測(cè)試頁(yè)面:

可見(jiàn),返回的內(nèi)容為普通用戶無(wú)權(quán)限.
我們?cè)賮?lái)登陸一個(gè)管理員:

然后復(fù)制返回的UUID,再去訪問(wèn)權(quán)限測(cè)試頁(yè)面:

可見(jiàn),返回的內(nèi)容為管理員能訪問(wèn)的數(shù)據(jù).
好了,關(guān)于DRF的權(quán)限就到這里了.
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Django restframework 源碼分析之認(rèn)證詳解
- django基于restframework的CBV封裝詳解
- 詳解Django-restframework 之頻率源碼分析
- django rest framework 實(shí)現(xiàn)用戶登錄認(rèn)證詳解
- Django Rest framework認(rèn)證組件詳細(xì)用法
- Django Rest framework之認(rèn)證的實(shí)現(xiàn)代碼
- Django Rest framework之權(quán)限的實(shí)現(xiàn)示例
- Django-Rest-Framework 權(quán)限管理源碼淺析(小結(jié))
- Django restframework 框架認(rèn)證、權(quán)限、限流用法示例
相關(guān)文章
python搭建簡(jiǎn)易服務(wù)器分析與實(shí)現(xiàn)
本文將介紹python搭建簡(jiǎn)易服務(wù)器實(shí)現(xiàn)步驟,需要了解的朋友可以參考下2012-12-12
在實(shí)驗(yàn)中需要自己構(gòu)造單獨(dú)的HTTP數(shù)據(jù)報(bào)文,而使用SOCK_STREAM進(jìn)行發(fā)送數(shù)據(jù)包,需要進(jìn)行完整的TCP交互。因此想使用原始套接字進(jìn)行編程,直接構(gòu)造數(shù)據(jù)包,并在IP層進(jìn)行發(fā)送,即采用SOCK_RAW進(jìn)行數(shù)據(jù)發(fā)送。使用SOCK_RAW的優(yōu)勢(shì)是,可以對(duì)數(shù)據(jù)包進(jìn)行完整的修改,可以處理IP層上的所有數(shù)據(jù)包,對(duì)各字段進(jìn)行修改,而不受UDP和TCP的限制。2014-02-02
Python實(shí)現(xiàn)的用戶登錄系統(tǒng)功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的用戶登錄系統(tǒng)功能,涉及Python流程控制及字符串判斷等相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
使用PyQt5實(shí)現(xiàn)一個(gè)鼠標(biāo)連點(diǎn)器
這篇文章主要為大家詳細(xì)介紹了如何使用PyQt5實(shí)現(xiàn)一個(gè)鼠標(biāo)連點(diǎn)器,從而對(duì)QVBoxLayout、QHBoxLayout和QStackedWidget進(jìn)行一個(gè)回顧復(fù)習(xí),需要的可以參考一下2023-12-12
大語(yǔ)言模型的開(kāi)發(fā)利器langchainan安裝使用快速入門(mén)學(xué)習(xí)
這篇文章主要為大家介紹了大語(yǔ)言模型的開(kāi)發(fā)利器langchain安裝使用快速入門(mén)學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
如何使用Python進(jìn)行PDF圖片識(shí)別OCR
這篇文章主要介紹了如何使用Python進(jìn)行PDF圖片識(shí)別OCR,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01
python?memory_profiler庫(kù)生成器和迭代器內(nèi)存占用的時(shí)間分析
這篇文章主要介紹了python?memory_profiler庫(kù)生成器和迭代器內(nèi)存占用的時(shí)間分析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,感興趣的小伙伴可以參考一下2022-06-06

