drf——自定义权限

发布时间 2023-05-23 10:25:59作者: 7dao

第一步:创建自定义权限

首先,需要创建自定义权限类以实现企业黑名单功能。在你的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响应。