drf之权限认证

drf总流程链接

https://www.cnblogs.com/daviddd/p/11918405.html

drf之权限认证

'''
承接总流程5.3的权限控制
权限认证:实例化每一个权限类得到一个对象列表,循环权限对象列表,执行每一个权限对象的
has_permession方法,返回true或者false,true表示通过权限认证,false表示没有通过,并抛出异常
'''

class APIView(View):

配置文件

permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
settings = api_settings

def initial(self, request, *args, **kwargs):
"""
Runs anything that needs to occur prior to calling the method handler.
"""

5.3 权限认证

self.check_permissions(request)

执行check_permissionds 函数,循环每一个权限对象,进行权限认证处理

def check_permissions(self, request):
"""
Check if the request should be permitted.
Raises an appropriate exception if the request is not permitted.
"""
# 5.31
for permission in self.get_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)

5.32 实例化权限类,得到权限对象列表

def get_permissions(self):
"""
Instantiates and returns the list of permissions that this view requires.
"""
return [permission() for permission in self.permission_classes]

5.33判断是否权限通过

def has_permission(self, request, view):
"""
Return True if permission is granted, False otherwise.
"""
# 通过,有权限
return True

如果return False,执行5.34的permission_denied函数,见60行,抛出异常

return False

def has_object_permission(self, request, view, obj):
"""
Return True if permission is granted, False otherwise.
"""
return True

5.34抛出异常

def permission_denied(self, request, message=None):
"""
If request is not permitted, determine what kind of exception to raise.
"""
if request.authenticators and not request.successful_authenticator:
raise exceptions.NotAuthenticated()
raise exceptions.PermissionDenied(detail=message)

自定义权限认证

from rest_framework.permissions import BasePermission

class MyPermission(BasePermission):
message = {"status": False, "error": "登录成功之后才能评论"}

def has_permission(self, request, view):
if request.method == "GET":
return True
if request.user:
return True
return False

def has_object_permission(self, request, view, obj):
return True

局部应用

py文件模块式引入

class CommentVIew():

permission_classes = [MyPermission]

pass

posted @ 2019-11-23 16:20  阿浪阿浪  阅读(162)  评论(0)    收藏  举报