一、权限实例
在阅读本文之前请先参考django rest framework 之 认证 中关于 django rest framework
的相关内容及实例
1、目录结构
为了更好的管理各个功能组件,在django rest framework 之 认证 中我们说到可以将认证类单独的拿出来,放到其他目录下,然后导入到 views.py
文件中,在权限环节我们亦可以这么做,目录结构就变成这样
在api这个app下创建一个utils包专门用来存放相关的组件。
2、为模型类添加认证字段
我们在models.py中定义了两个模型类,分别是
from django.db import modelsclass 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,这样就可以通过用户的身份验证不同的权限。如果想要定义一个视图类,这个类中的逻辑只有超级用户才能访问。
3、具体权限认证
可以再utils中的 permissions.py
中这么写
# utils/permission.pyclass SVIPPremission(object): message = "必须是SVIP才能访问" # 这里的message表示如果不通过权限的时候,错误提示信息 def has_permission(self,request,view): if request.user.user_type != 3: return False return Trueclass MyPremission(object): # 这个权限类表示当用户为SVIP时不可通过 def has_permission(self,request,view): if request.user.user_type == 3: return False return True
这里只是判断用户的 USER_TYPE
的字段,判断用户是否有权限,也可以添加其他的逻辑进行判断。
4、全局配置
在上一节的django rest framework 之 认证 的认证中,将认证类放到了 settings.py
文件中,这样会作用到视图中的每一个视图类,如果视图类想要自己进行认证,只需要重写 authentication_classes
即可,那么对于权限来说我们也可以这么做,
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ['api.utils.authenticate.FirstAuthenticate', 'api.utils.authenticate.MyAuthenticate'], "UNAUTHENTICATED_USER": None, # 匿名,request.user = None "UNAUTHENTICATED_TOKEN": None,# 匿名,request.auth = None "DEFAULT_PERMISSION_CLASSES": ['api.utils.permission.MyPermission'], # 表示每一个视图类(只要不重写permission_classes属性),都需要SVIP的用户才能访问。}
新闻热点
疑难解答