Rob*_*wen 3 django rest django-rest-framework
我想构建一个具有字段级权限的 API。我从数据库表中获得了这些权限,但是在 REST 框架中检查用户是否可以对对象的字段执行 CRUD 操作的地方是什么?
database --- model ---- ModelSerializer ---- ModelViewSet --- browser
在 ModelSerializer 中?在这里,我可以在字段到达视图集之前删除字段,但默认情况下我无权访问 request.user,因此我必须实现它,这可以完成,但不能与我拥有的其他第 3 方库一起使用(django-rest-swagger)
还是在 ModelViewset 中?我可以覆盖列表、创建、更新和销毁方法以删除用户无权访问的字段。但这不适用于我的 Metadata 实现,因为它直接从序列化程序获取元数据。
或者两者都有?例如:DROP不被允许读取在串行当模型的获取通过串行,并在视图集落不被允许的写,之前他们得到传递回至串行?
您可以根据特定请求所需的字段创建不同的序列化程序。然后您需要get_serializer_class()在您的视图中覆盖该函数并根据您的逻辑决定序列化程序。
根据 DRF 文档 get_serializer_class()
可能会被覆盖以提供动态行为,例如使用不同的序列化程序进行读写操作,或者为不同类型的用户提供不同的序列化程序。
例如:
class MyView(..):
    def get_serializer_class(self):
        if self.request.user.is_staff: # check if staff user
            return FullAccountSerializer 
        return BasicAccountSerializer
    ... 
DRF 文档中有一个关于权限的很好的部分。处理(和检查)它们的好地方是在视图集中。要从文档复制示例:
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)
    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)
如果您想要自定义权限检查器,您可以定义自己的权限检查器,并指定替换IsAuthenticated为您自己的类
| 归档时间: | 
 | 
| 查看次数: | 2098 次 | 
| 最近记录: |