python - Django Rest Framework get_permissions 需要一个或其他权限
问题描述
我已经在 ListCreateAPIView 上定义了 get_permissions 方法并在那里应用了自定义权限,但我有一个问题。
class ListSchoolStudents(generics.ListCreateAPIView, TeacherPermission):
serializer_class = StudentSerializerForList
permission_classes = [IsAuthenticated & TeacherPermission]
def get_queryset(self):
pk = self.kwargs['pk']
return Student.objects.filter(school__id = pk).select_related('school','school_class').prefetch_related('subject')
def get_permissions(self):
if self.request.method in ['POST']:
return [PrincipalPermission()]
return [permissions.IsAuthenticated(), TeacherPermission()]
当我像这样定义它时,Principal 只能使用 POST 方法。但我也希望该用户能够使用其他方法。我尝试过这样的事情:
def get_permissions(self):
if self.request.method in ['POST']:
return [PrincipalPermission()]
return [permissions.IsAuthenticated(), TeacherPermission(), PrincipalPermission() ]
但据我了解,它需要满足列表中的所有权限。
我正在寻找这样的东西
return [permissions.IsAuthenticated(), TeacherPermission() or PrincipalPermission() ]
我知道这种可能性存在于 permission_classes 通过写作
permission_classes = [IsAuthenticated | TeacherPermission]
有没有一种简单的方法可以做到这一点,或者如果用户是教师或校长,我被迫编写另一个自定义权限来授予权限?
解决方案
如您提供的示例所示,|
应应用于类,因此:
return [permissions.IsAuthenticated(), (TeacherPermission | PrincipalPermission)() ]
但是,有一种方法可以简化这一点,利用 the@property
和 simple 属性与外部无法区分的事实。我会推荐这种模式作为覆盖get_permissions
方法的替代品。
class ListSchoolStudents(generics.ListCreateAPIView, TeacherPermission):
serializer_class = StudentSerializerForList
@property
def permission_classes(self):
if self.request.method in ['POST']:
return [PrincipalPermission]
return [IsAuthenticated, TeacherPermission | PrincipalPermission]
推荐阅读
- javascript - 用用户头像图片填充图片中的某个位置
- javascript - 如何在 Puppeteer 中使用代理(每页一页)
- system-verilog - 当仅使用总线名称而不是 [a:b] 时,vivado 是否考虑其所有位或仅考虑最低有效位
- javascript - 如何在 React.js 中每 5 秒生成一个随机数?
- python - Pandas 数据框只选择所有 True 的列
- angular - How to highlight option value in angular mat-autocomplete after setValue?
- azure - 用于活动记录的 azure 数据资源管理器
- selenium - 机器人框架未在 Firefox 中单击下拉菜单
- node.js - AWS Lamdba nodejs12.x 错误 `args[3]->IsInt32()' 失败
- autodesk-forge - 加载多个模型时,Forge 查看器中的启动模型浏览器崩溃