python - 根据 Django 中选择的按钮更改权限
问题描述
我正在研究 DRF 并使用视图集来创建 API。这里我遇到了一个问题:假设我在一个表单中有两个按钮,即员工和经理。如果用户单击 Employee,则它只能访问 GET 请求,如果他单击 Manager,则它具有 POST、PUT、PATCH 权限。
模型.py
class Employee(models.Model):
emp_id = models.AutoField(primary_key=True)
emp_name = models.CharField(max_length=30)
email = models.EmailField(max_length=254, unique=True)
position = models.CharField(max_length=30)
team = models.CharField(max_length=30)
phone = models.CharField(max_length=20, unique=True)
视图集.py
class EmpViewSet(viewsets.ModelViewSet):
serializer_class = EmployeeSerializer
queryset = Employee.objects.all()
permission_classes = [OfficeEngineerPermission]
序列化程序.py
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = '__all__'
我试图编写自定义权限,但它不起作用。
custom_permiss.py
SAFE_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'HEADER', 'OPTIONS']
class OfficeEngineerPermission(BasePermission):
def has_permission(self, request, view):
if (request.method in SAFE_METHODS and request.user == 'OfficeEngineer'):
return True
return Response({'message':'This is not allowed'})
我读了所有的东西,但被卡住了。请建议!
解决方案
您可以覆盖视图集get_permissions()
方法并为每个视图集操作定义权限
https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions
例如,我使用以下内容进行了快速测试:
class MyModelViewset(viewsets.ModelViewSet):
serializer_class = MyModelSerializer
model = MyModel
def get_permissions(self):
if self.action == "create":
self.permission_classes = [IsNotSuperUser]
elif self.action == "update":
self.permission_classes = [IsTeacher]
elif self.action == "partial_update":
self.permission_classes = [IsNotSuperUser]
elif self.action == "list":
self.permission_classes = [IsSuperUser, IsAuthenticated]
elif self.action == "retrieve":
self.permission_classes = [IsSuperUser, IsAuthenticated]
return super(self.__class__, self).get_permissions()
有了这个,您可以控制每个 HTTP 动词的权限。
推荐阅读
- reactjs - 在 react react-leaflet 中编译失败
- r - 在 rsm 包中使用 persp() 时,“轮廓”不是图形参数
- bash - 包装外壳内置程序
- windows - 文件夹上的这个剑标志是什么意思?
- rust - 实施伪裸约束
- laravel - Laravel 刀片中@if @else 阶梯的正确语法
- javascript - antd react 中是否有任何解决方案来检查组件中未保存的更改?
- liquid - 从另一个值中减去一个值不起作用
- reactjs - 如何从 textInput 传递参数
- flutter - 当我单击按钮时,此错误“在 null 上调用了 getter 'dx'。接收方:null 尝试调用:dx”出现在我的调试控制台中