rest_framework-02-权限-内置权限源码流程
权限
问题:不同视图不同权限可以访问
1.models.py
from django.db import modelsclass UserInfo(models.Model): user_type_choices = ( (1,'普通用户'), (2,'VIP'), (3,'SVIP'), ) user_type = models.IntegerField(choices=user_type_choices) # username = models.CharField(max_length=32) username = models.CharField(max_length=32,unique=True) password = models.CharField(max_length=64)class UserToken(models.Model): user = models.OneToOneField(to='UserInfo') token = models.CharField(max_length=64)
2.用户类型:
3.views.py:
假设订单相关业务(只有SVIP用户有权限)
假设用户信息相关业务(只有普通用户、VIP有权限)
4.运行结果:
基本使用
以上的权限代码封装到一个类中,以后各个视图的get请求直接调用即可。不用每个类都写一遍权限。
自定义权限类: 需要找到has_permission方法
0.看源码:
1.
2.
3.复制源码has_permission方法
4.继续定义权限类:has_permission方法返回True表示有权访问。
5.定义好了权限类,局部使用。
局部权限
6.运行结果:
7.再定义一个权限,出SVIP以外,其他用户都能访问。
8.将全权都放到另一个单独的文件中。
然后视图文件需要则引入。
views.py应用即可
代码:
基本使用: class MyPermission(object): def has_permission(self,request,view): if request.user.user_type != 3: return False return True class OrderView(APIView): """ 订单相关业务(只有SVIP用户有权限) """ permission_classes = [MyPermission,] def get(self,request,*args,**kwargs): # request.user # request.auth self.dispatch ret = { 'code':1000,'msg':None,'data':None} try: ret['data'] = ORDER_DICT except Exception as e: pass return JsonResponse(ret)
permission.pyfrom rest_framework.permissions import BasePermission# 权限class SvipPermission(BasePermission): message = "必须是SVIP才能访问" def has_permission(self,request,view): if request.user.user_type != 3: # SVIP return False # 无权访问 return True # 有权访问class MyPermission1(BasePermission): def has_permission(self, request, view): if request.user.user_type == 3: # 普通用户、VIP return False # 无权访问 return True # 有权访问views.pyfrom api.utils.permission import MyPermission1from api.utils.throttle import VisitThrottleclass OrderView(APIView): """ 订单相关业务(只有SVIP用户有权限) """ # 权限 # permission_classes = [SvipPermission,] def get(self, request, *args, **kwargs): # request.user # request.auth self.dispatch # if request.user.user_type != 3: # return HttpResponse('无权访问') ret = { 'code':1000,'msg':None,'data':None} try: ret['data'] = ORDER_DICT except Exception as e: pass return JsonResponse(ret)class UserInfoView(APIView): """ 用户信息相关业务(只有普通用户、VIP有权限) """ # 权限 写了就不用全局的svip权限了。 permission_classes = [MyPermission1, ] def get(self, request, *args, **kwargs): # if request.user.user_type == 3: # return HttpResponse('无权访问') return HttpResponse('用户信息')
以上的单视图应用。全局使用怎么办呢?
全局权限
1.权限源码流程:
2.
3.
4.
5.
6.
7.局部配置
8.permission.py
9.全局配置 settings.py
"DEFAULT_PERMISSION_CLASSES":['api.utils.permission.SvipPermission'], # 权限
10.继续看源码:
11.每一个权限都有该方法 has_permission
12.如果返回Fasle,则执行报错,抛出异常。
permission_denied
13.抛出异常
14.默认英文报错
运行结果:
15.如何改成中文报错信息呢?
运行结果:
内置权限
1.内置权限源码流程
2.为了让我们的权限更正规,必须继承该内置权限。
代码:
from rest_framework.permissions import BasePermission# 权限class SvipPermission(BasePermission): message = "必须是SVIP才能访问" def has_permission(self,request,view): if request.user.user_type != 3: # SVIP return False # 无权访问 return True # 有权访问class MyPermission1(BasePermission): def has_permission(self, request, view): if request.user.user_type == 3: # 普通用户、VIP return False # 无权访问 return True # 有权访问
梳理: 1. 使用 - 类,必须继承:BasePermission,必须实现:has_permission方法 from rest_framework.permissions import BasePermission class SVIPPermission(BasePermission): message = "必须是SVIP才能访问" def has_permission(self,request,view): if request.user.user_type != 3: return False return True - 返回值: - True, 有权访问 - False,无权访问 - 局部 class UserInfoView(APIView): """ 订单相关业务(普通用户、VIP) """ permission_classes = [MyPermission1, ] def get(self,request,*args,**kwargs): return HttpResponse('用户信息') - 全局 REST_FRAMEWORK = { "DEFAULT_PERMISSION_CLASSES":['api.utils.permission.SVIPPermission'] }