首页 > 编程 > Python > 正文

Django Rest framework之权限的实现示例

2020-02-16 00:10:20
字体:
来源:转载
供稿:网友

一、权限实例

在阅读本文之前请先参考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的用户才能访问。}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表