2016-01-23 39 views
0

所以我有这样的:如何在DRF视图集中捕获请求?

class UserViewSet(viewsets.ModelViewSet): 
    permission_classes = [TokenHasReadWriteScope] 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    entity_name = 'user' 
    perm_type = { 
     'POST': 'create', 
     'GET': 'read', 
     'PATCH': 'update', 
     'DELETE': 'delete' 
    } 

    def check_permissions(self, request): 
     user = request.user 
     has_permissions = user.has_entity_permissions(
      name=self.entity_name, 
      perm_type=self.perm_type[request.method] 
     ) 
     if not has_permissions: 
      raise PermissionDenied 

    def create(self, request, *args, **kwargs): 
     self.check_permissions(request) 
     return super().create(request, *args, **kwargs) 

    def list(self, request, *args, **kwargs): 
     self.check_permissions(request) 
     return super().list(request, *args, **kwargs) 

    def update(self, request, *args, **kwargs): 
     self.check_permissions(request) 
     return super().update(request, *args, **kwargs) 

我有一个自定义的安全服务器,目的是集中公司所有的应用程序,所以当我们有一个新员工,我们可以给他访问该型动物应用在每个实体中拥有不同的权限以及来自单个应用的属性,而不是创建用户并在每个应用中授予他权限。

所以基本上在“check_permission”功能,我检查了这一点,这取决于在请求方法(perm_type相关联的请求方法与权限(CRUD))

问题: 有赶方式请求之前进入列表,回顾,创建,更新或删除(Middlewears不工作,因为我需要知道实体类型或端点,这就是为什么我设置entity_name变量,但如果你有一个更好的主意是值得欢迎的)

+0

如果我通过_recching request_明白你的意思,你应该考虑在列表周围使用方法装饰器,检索,创建和更新。因此,装饰器功能可以帮助您根据需要对请求执行任何预处理。 –

+0

不要忘记'PUT'请求,你目前忽略它们。 –

回答

0

当你已经有APIView类实现了check_permissions时,为什么凌驾你的动作方法? (其中ModelViewSet继承自)

只需简单地通过覆盖它来添加代码的和平。