首页 > 其他分享 >drf——自定义权限

drf——自定义权限

时间:2023-05-23 10:35:36浏览次数:41  
标签:name 自定义 permission company 视图 blacklisted 权限 drf

第一步:创建自定义权限

首先,需要创建自定义权限类以实现企业黑名单功能。在你的permissions.py文件中创建一个新的类,例如:

from rest_framework import permissions

class BlacklistPermission(permissions.BasePermission):
    message = 'Your account has been blacklisted.'

    def has_permission(self, request, view):
        user = request.user
        if user.is_authenticated and user.company.blacklisted:
            return False
        return True

上述代码中,BlacklistPermission是继承了BasePermission的DRF自定义权限类,它包含了用户是否被列入企业黑名单的判断逻辑。has_permission方法会在每个请求到达视图之前调用检查权限,如果该方法返回False,则直接返回403 Forbidden响应,并且包含message中指定的错误消息。

has_permission返回True时,请求将继续到达视图,否则将被拒绝访问。

第二步:设置权限类

接下来,在你的视图中添加permission_classes属性,并将其值设置为新创建的自定义权限类,例如:

from rest_framework.views import APIView
from rest_framework.response import Response

class MyView(APIView):
    permission_classes = [BlacklistPermission]

    def get(self, request, format=None):
        content = {'status': 'success'}
        return Response(content)

上述代码中,MyView是一个DRF视图类,它包含了get方法的实现。permission_classes属性被设置为之前创建的BlacklistPermission权限类。这样,当请求到达该视图时,将会优先调用BlacklistPermissionhas_permission方法来检查用户是否被列入黑名单。

第三步:保存企业黑名单信息

最后,您需要编写一些代码来实现将企业加入或移出黑名单的功能。在你的企业模型中添加一个布尔类型的字段,例如:

from django.db import models

class Company(models.Model):
    name = models.CharField(max_length=100)
    blacklisted = models.BooleanField(default=False)

    def __str__(self):
        return self.name

上述代码中,Company是一个具有nameblacklisted两个字段的Django模型类。blacklisted字段表示该企业是否已经被列入黑名单,默认值为False。

接下来,在你的视图中添加如下代码来更改blacklisted字段的值:

 
class BlacklistView(APIView):
    def post(self, request, format=None):
        company_name = request.data.get('company_name')
        company = Company.objects.get(name=company_name)
        company.blacklisted = True
        company.save()
        return Response({'status': 'success'})

    def delete(self, request, format=None):
        company_name = request.data.get('company_name')
        company = Company.objects.get(name=company_name)
        company.blacklisted = False
        company.save()
        return Response({'status': 'success'})

上述代码中,BlacklistView是一个DRF视图类,它包含了postdelete方法的实现。当客户端向/blacklist/端点发送POST请求时,企业将被列入黑名单;当发送DELETE请求时,企业将从黑名单中移除。

拓展:

  当你需要设置多个权限时

  permission_classes = [IsAuthenticated, DjangoModelPermissions, BlacklistPermission]

  上述代码中,我们在permission_classes列表中添加了三个权限类:IsAuthenticated(需要进行身份验证)、DjangoModelPermissions(基于模型的权限)和BlacklistPermission(自定义的企业黑名单权限)。

  当请求到达视图时,DRF会按顺序调用每个权限类的has_permission方法。只有当所有权限类都返回True时,用户才能访问该视图,否则将返回403 Forbidden响应。

标签:name,自定义,permission,company,视图,blacklisted,权限,drf
From: https://www.cnblogs.com/7dao/p/17422545.html

相关文章

  • pytest + yaml 框架 -29.模板过滤器语法与自定义过滤器使用
    前言v1.2.6版本支持模板过滤器语法的使用,并且可以自定义过滤器了。针对有同学提到上个接口返回一个id值,下个接口引用变量的时候需要根据这个值做一些运算,比如在引用的结果加1.jinja2是可以支持模板过滤器语法的,本篇介绍下模板过滤器的相关使用.v1.2.6版本主要更新以下几点1......
  • Qt编写视频监控系统74-悬浮工具栏(半透明/上下左右位置/自定义按钮)
    一、前言在监控系统中一般在视频实时预览的时候,希望提供一个悬浮工具条,可以显示一些提示信息比如分辨率、码率、帧率,提供一堆快捷操作按钮,可以录像、抓拍、云台控制、关闭等操作,参考了国内很多监控厂商客户端软件,总结下来基本就是悬浮条可以半透明悬浮在通道窗体上,也有少部分是固......
  • .Net6自定义拦截器
    .Net6自定义拦截器拦截器是Aop(面向切面编程)的思想指的是不改变原代码封装的前提下去实现更多功能这里通过.net的特性(给一个目标对象添加一段配置信息)的方式去实现拦截器功能新建一个特性namespaceCorePolly{publicclassTestAttribute:Attribute{publ......
  • goframe API 自定义接口返回值处理
    前言goframe默认使用了中间键ghttp.MiddlewareHandlerResponse,HTTPServer的数据返回通过ghttp.Response对象实现,ghttp.Response对象实现了标准库的http.ResponseWriter接口。数据输出使用Write*相关方法实现,并且数据输出采用了Buffer机制,因此数据的处理效率比较高......
  • drf——反序列化校验源码(了解)、断言、drf之请求和响应、视图之两个视图基类
    1.模块与包#模块与包 模块:一个py文件被别的py文件导入使用,这个py文件称之为模块,运行的这个py文件称之为脚本文件包:一个文件夹下有__init__.py#模块与包的导入问题'''1.导入模块有相对导入和绝对导入,绝对导入的路径是从环境变量开始的2.导入任何模块,如果......
  • drf自动生产路由
    自动生产路由#ReadOnlyModelViewSet:两个接口,list和retrievefromrest_framework.viewsetsimportReadOnlyModelViewSetclassBookLIstretrieveView(ReadOnlyModelViewSet):queryset=Book.objects.all()serializer_class=Bookserializers#ViewSetMixin:魔......
  • 5个视图扩展类,9个视图子类,视图集,drf之路由
    5个视图扩展类:1from.modelsimportBook2from.serializerimportBookSerialzier3fromrest_framework.responseimportResponse4fromrest_framework.genericsimportGenericAPIView56fromrest_framework.mixinsimportListModelMixin,CreateModelMixi......
  • 一个基础的vue图片放大镜自定义指令
    <template> <div>  <divv-magnifyref="content"class="content">   <imgsrc="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"alt="">  </div> </d......
  • 记Perfeye自定义项实现对比需求
    记Perfeye自定义项实现对比需求背景Perfyeye平台很早就支持对比功能了,但是支持的模块不全,需求方现在想要支持自定义列的需求对比功能,用来显示多份报告之间的差异以及性能趋势。刚接到这个需求的时候,我想,这不就是简简单单CV复制一下老代码的逻辑,改改相应字段就可以了,30分钟也......
  • 若依框架当参数为Map集合时数据权限的设置
    1、controller接口参数类型@PreAuthorize("@ss.hasPermi('manual:staff:list')")@GetMapping("/list")publicTableDataInfolist(@RequestParamMap<String,Object>map){map.put("params",newParmStaffCostManu......