4.restframework-权限
4.1权限:
- 权限在单个视图应用。
class MyPermission(object):
"""认证类"""
def has_permission(self,request,view):
"""重写has_permission方法"""
#判断用户类型
if request.user.user_type != 3:
return False
return True
class OrderView(APIView):
"""订单业务 (只有SVIP能看到)"""
#message当权限未通过,返回内容。
message = "必须是SVIP才可以进行访问"
authentication_classes = [Authtication,]#用于认证
permission_classes = [MyPermission,]#用于权限控制
def get(self,request,*args,**kwargs):
ret = {"code": 1000, "msg": None, "data": None}
try:
ret['data'] = ORDER_DICT
except Exception as e:
pass
return JsonResponse(ret)
-
效果:
-
当用于在url键入user_type=1的用户拒绝访问:
http://127.0.0.1:8000/api/v1/order/?token=408a04dbce13814fd076807f865429b4
-
当用户在url键入user_type=3的用户拿到数据库内容:
http://127.0.0.1:8000/api/v1/order/?token=f2c781da6953632d0c5421e8cb17e740
-
4.2权限源码解析
#-----------------------dispatch---------------------------
#执行dispatch方法:
def dispatch(self, request, *args, **kwargs):
...
#封装request,获取一个加强版request
request = self.initialize_request(request, *args, **kwargs)
...
#执行初始化方法
self.initial(request, *args, **kwargs)
...
#-----------------------------------------------------------
#-----------------------initial---------------------------
def initial(self, request, *args, **kwargs):
...
self.check_permissions(request)#进行权限检验。
...
#-----------------------------------------------------------
#-----------------------check_permissions-------------------
def check_permissions(self, request):
# 列表存储着 权限类的对象
for permission in self.get_permissions():
#如果是自定义权限类必须有has_permission方法。这样才能进行权限判断,权限认证时,当什么都没有返回表示正常执行,触发异常表示权限验证失败。 message就是触发异常后回的异常消息.
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)
#循环遍历self.get_permissions(),那么self.get_permissions()做什么事情呢?进入看一下
#--------------------get_permissions------------------------
def get_permissions(self):
return [permission() for permission in self.permission_classes]
#通过遍历permission_classes,返回一个列表。
#而在我们没有在视图定义:permission_classes时候会默认找配置文件的permission_classes,如下:
permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
#-----------------------------------------------------------
4.3全局和局部配置权限:
#全局配置settings.py配置
"DEFAULT_PERMISSION_CLASSES":['app.utils.permission.MyPermission']
#局部配置
permission_classes = [MyPermission,]#用于权限控制,MyPermission自定义权限类
4.4django内置权限类
from rest_framework.permissions import BasePermission
class BasePermission(metaclass=BasePermissionMetaclass):
"""
A base class from which all permission classes should inherit.
"""
#定义has_permission方法
def has_permission(self, request, view):
"""
Return `True` if permission is granted, `False` otherwise.
"""
return True
def has_object_permission(self, request, view, obj):
"""
Return `True` if permission is granted, `False` otherwise.
"""
return True
#允许任何访问
class AllowAny(BasePermission):pass
4.5权限使用流程:(自定义权限类)
-
为了规范:以后写权限类,要继承
BasePermission
. -
返回值:
- True 有权访问
- False 无权访问