REST-Framework: 权限组件
目录
一 权限简介
只用超级用户才能访问指定的数据,普通用户不能访问,有了这种类似的需求就要有权限组件对其限制, 权限组件就这样产生了
权限组件的使用和认证组件的使用很类似, 不管是全局使用,还是局部使用都可以参考认证组件的使用, 在需要注意的地方和不同之处我会特别指出
二 局部使用
from rest_framework.permissions import BasePermission class UserPermission(BasePermission): # 这里的message是权限不足时的打印信息 message = '不是超级用户,查看不了' def has_permission(self, request, view): # user_type = request.user.get_user_type_display() # if user_type == '超级用户': user_type = request.user.user_type print(user_type) if user_type == 1: return True else: return False class Course(APIView): authentication_classes = [TokenAuth, ] permission_classes = [UserPermission,] def get(self, request): return HttpResponse('get') def post(self, request): return HttpResponse('post')
局部使用只需要在视图类里加入:
permission_classes = [UserPermission,]
三 全局使用
REST_FRAMEWORK={ "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",] }
自定义权限功能(重点)
1 登录成功以后,超级用户可以干某些事,普通用户不能干---》超级用户可以查看某些接口,普通用户不能查看 2 使用写一个类继承BasePermission,重写has_permission class SuperPermission(BasePermission): def has_permission(self, request, view): # Return `True` if permission is granted, `False` otherwise. # 超级用户可以访问,除了超级用户以外,都不能访问 if request.user.user_type == '1': return True else: return False 3 局部使用和全局使用 -在想局部使用的视图类上 permission_classes = [MyAuthen.SuperPermission] -全局使用 REST_FRAMEWORK = { "DEFAULT_PERMISSION_CLASSES": ["app01.MyAuthen.SuperPermission", ] } -局部禁用 permission_classes = []
四 源码分析
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) )
self.get_permissions()
def get_permissions(self): return [permission() for permission in self.permission_classes]
权限类使用顺序:先用视图类中的权限类,再用settings里配置的权限类,最后用默认的权限类
权限源码分析
8 源码分析 -APIView的dispatch---》APIView的initial---》APIView的check_permissions(request) for permission in self.get_permissions(): # 权限类对象放到列表中 if not permission.has_permission(request, self): self.permission_denied( request, message=getattr(permission, 'message', None), code=getattr(permission, 'code', None) ) 9 错误信息的中文显示 在权限类中加一个 message=字符串
模型层choice字段的使用(重点)
1 模型表:Student表,写接口应该选择继承哪个视图类 2 推荐使用自动生成路由的方式(继承ViewSetMixin及它的字类) 3 但是目前来说,你先实现功能即可(至于选择哪个,慢慢体会) 4 choice的使用 -在模型类中使用 sex = models.SmallIntegerField(choices=((1, '男'), (2, '女'), (3, '未知')), default=1) -在视图类中,在序列化类中 -get_字段名_dispaly()的方法,该方法获得choice字段对应的数据
每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)