日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

drf源码分析系列---权限

發布時間:2024/10/8 编程问答 31 如意码农
生活随笔 收集整理的這篇文章主要介紹了 drf源码分析系列---权限 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

權限的使用

全局使用

from rest_framework.permissions import BasePermission
from rest_framework import exceptions class MyPermission(BasePermission):
message = {'code': 10001, 'error': '你沒權限'} #沒有權限的報錯信息
def has_permission(self, request, view): #使用多條數據的時候
if request.user:
return True #有權限
# raise exceptions.PermissionDenied({'code': 10001, 'error': '你沒權限'})
return False #沒有權限 def has_object_permission(self, request, view, obj): #使用單條數據的時候
return False 當應用了全局的權限,有一個視圖不需要權限在改視圖定義權限為空列表: permission_classes = [MyPermission,]
settings中的權限配置(全局)
DEFAULT_PERMISSION_CLASSES = ["api.views.auth.MyPermission",]

局部使用

from api.views.account import MyPermission
# 文章的展示,添加
class ArticleView(ListAPIView,CreateAPIView):
permission_classes = [MyPermission,]#一個視圖的權限應用,在settings中就不用再寫權限配置
def get_serializer_class(self):
if self.request.method == 'GET':
return ArticleSerializer
elif self.request.method == 'POST':
return AddArticleSerializer

權限的源碼分析

執行流程

1.請求進來執行dispatch方法中的initialize_request方法
def initialize_request(self, request, *args, **kwargs):
parser_context = self.get_parser_context(request) return Request(
request,
parsers=self.get_parsers(),
authenticators=self.get_authenticators(),
negotiator=self.get_content_negotiator(),
parser_context=parser_context
)
2.執行inital
def initial(self, request, *args, **kwargs):
.......略過的代碼
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme self.perform_authentication(request) #認證函數
self.check_permissions(request) #權限函數
self.check_throttles(request)
3.執行check_throttles(request)
def check_permissions(self, request): for permission in self.get_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
) def get_permissions(self): return [permission() for permission in self.permission_classes]
get_permissions是已經封裝到request中的權限對象
4.執行權限對象中的has_permission
class MyPermission(BasePermission): #自定義的權限類
message = '你沒有權限'
def has_permission(self, request, view): #獲取多個對象的時候執行
if request.method == "GET": #對請求進行權限認證,get請求有權限,代表可以看,不可以進行增刪改查
return True
else:
#對增刪改查有權限
if request.user and request.auth: #判斷該用戶情況在進行判斷 return True
return False #無權限 def has_object_permission(self, request, view, obj): #獲取單個對象的時候執行
return self.has_permission(request, view)

概括

1.請求進來時,先執行dispatch方法,對的request進行重新封裝
2.執行get_permissions(),循環permission_classes得到這個權限類的對象,把對象也封裝進去
3.循環這個權限對象列表,執行每個對象中的has_permission方法,返回True就代表有權限,False代表沒有權限
# has_permission是自己定義權限類中的方法,重寫該方法

總結

以上是生活随笔為你收集整理的drf源码分析系列---权限的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。