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
权限类。这样,当请求到达该视图时,将会优先调用BlacklistPermission
的has_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
是一个具有name
和blacklisted
两个字段的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视图类,它包含了post
和delete
方法的实现。当客户端向/blacklist/
端点发送POST请求时,企业将被列入黑名单;当发送DELETE请求时,企业将从黑名单中移除。
拓展:
当你需要设置多个权限时
permission_classes = [IsAuthenticated, DjangoModelPermissions, BlacklistPermission]
上述代码中,我们在permission_classes
列表中添加了三个权限类:IsAuthenticated
(需要进行身份验证)、DjangoModelPermissions
(基于模型的权限)和BlacklistPermission
(自定义的企业黑名单权限)。
当请求到达视图时,DRF会按顺序调用每个权限类的has_permission
方法。只有当所有权限类都返回True
时,用户才能访问该视图,否则将返回403 Forbidden响应。