Django Rest Framework之权限组件

Django Rest Framework之权限组件

一:源码剖析

DRF的版本控制、认证、权限、频率组件都在initial方法里初始化
Django Rest Framework之权限组件
我们点进去看看:
Django Rest Framework之权限组件
其实我们版本、认证、权限、频率控制走的源码流程大致相同。
我们的权限类中一定要有has_permission方法——框架为我们提供的钩子。
我们再来看看rest_framework.permissions文件中存放的框架为我们提供的所有权限的方法:
Django Rest Framework之权限组件
注意图中的BasePermission类,这个类是框架为我们提供的基础权限类,我们自定义的权限类都要继承此类。
全局权限配置(settings.py文件):

REST_FRAMEWORK = {
  # 配置全局认证
  'DEFAULT_AUTHENTICATION_CLASSES': ["指定自定义的权限类", ]
}

DRF默认的认证类型:
Django Rest Framework之权限组件

二:使用方法

数据模型:

class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    token = models.UUIDField(null=True, blank=True)
    type = models.IntegerField(choices=((1, '普通用户'), (2, 'VIP'), (3, 'SVIP')), default = 1)

自定义权限类:

from rest_framework.permissions import BasePermission # 导入基础的权限类

class MyPermission(BasePermission):
  """必备的属性和方法,基本固定的逻辑"""
  message = "普通用户无权访问的数据"
  def has_permission(self, request, view):
    # 注意:源码中初始化时的顺序是认证在前,权限在后,所以只要认证通过
    # 获取认证控制的返回值
    print("用户名:", request.user)
    user_obj = request.user
    print(user_obj)
    if user_obj.type == 1:
      return False # 普通用户
    return True # VIP及以上

路由设计:

urlpatterns = [
    re_path(r'^login/$', views.LoginView.as_view()),
    re_path(r'^test_permission/$', views.TestPermissionView.as_view()),
]

测试视图类:

class TestPermissionView(APIView):
  # 在视图中增加如下属性,即表明此视图要走如下组件的逻辑
  authentication_classes = [MyAuth, ] # 自定义的认证组件
  permission_classes = [MyPermission, ] # 权限控制组件

  def get(self, request):
    return Response("这里是VIP及以上用户能访问的数据")

测试:这里我在数据库中添加了两个用户:ginvip为普通用户;admin为VIP用户
普通用户访问:
Django Rest Framework之权限组件
admin用户测试:
Django Rest Framework之权限组件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值