drf源码分析系列---权限
生活随笔
收集整理的這篇文章主要介紹了
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源码分析系列---权限的全部內容,希望文章能夠幫你解決所遇到的問題。