在阅读本文之前请先参考django rest framework 之 认证中关于django rest framework
的相关内容及实例
权限其实的流程跟之前的认证流程是一样的,认证类封装到request中,然后再调用认证类的方法,不过这里的方法返回值不再是像认证组件那样的直接返回一个认证的对象,而是返回一个True
或者False
值表示认证过的对象是否有某些权限再进行具体操作。
一、目录结构
为了更好的管理各个功能组件,在django rest framework 之 认证中我们说到可以将认证类单独的拿出来,放到其他目录下,然后导入到views.py 文件中,在权限环节我们亦可以这么做,目录结构就变成这样
在api这个app下创建一个utils包专门用来存放相关的组件。
二、实例
1、添加权限类
我们在models.py中定义了两个模型类,分别是
from django.db import models
class UserInfo(models.Model):
USER_TYPE = (
(1,'普通用户'),
(2,'VIP'),
(3,'SVIP')
)
user_type = models.IntegerField(choices=USER_TYPE, default=1)
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
class UserToken(models.Model):
user = models.OneToOneField(UserInfo,on_delete=models.CASCADE)
token = models.CharField(max_length=64)
在UserInfo中通过为用户添加一个user_type字段来保证用户的身份,是普通用户,VIP还是SVIP,这样就可以通过用户的身份验证不同的权限。如果想要定义一个视图类,这个类中的逻辑只有超级用户才能访问,可以再utils中的permissions.py中这么写
# utils/permission.py
class SVIPPremission(object):
message = "必须是SVIP才能访问" # 这里的message表示如果不通过权限的时候,错误提示信息
def has_permission(self,request,view):
if request.user.user_type != 3:
return False
return True
class MyPremission(object):
# 这个权限类表示当用户为SVIP时不可通过
def has_permission(self,request,view):
if request.user.user_type == 3:
return False
return True
未完待续