2017-10-05 105 views
0

我在玩djangorestframework,我的目标是在我的视图上使用DjangoModelPermissions,它对GET请求做出反应。官方文档说:Django Rest Framework在ListAPIView上使用DjangoModelPermissions

默认行为也可以覆盖以支持自定义模型 权限。例如,您可能需要为GET请求包含view模型 权限。

Source

所以我修改我的模型如下所示:

class User(AbstractUser): 
    display_name = models.CharField(_('Display Name'), blank=True, max_length=255) 

    class Meta: 
     permissions = (
      ("view_user", "Can view users"), 
     ) 

    def __str__(self): 
     return self.username 

和视图:

class UserListAPIView(ListAPIView): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    permission_classes = (permissions.DjangoModelPermissions,) 

设置:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ), 
    'DEFAULT_PERMISSION_CLASSES': [ 
     'rest_framework.permissions.DjangoModelPermissions' 
    ] 
} 

问题是,我实施的UserListAPIView成功返回一个不属于Group的用户的所有对象的列表,既没有任何自定义User Permission。在我看来,DjangoModelPermissions不起作用。

class CustomDjangoModelPermission(permissions.DjangoModelPermissions): 

    def __init__(self): 
     self.perms_map['GET'] = ['%(app_label)s.view_%(model_name)s'] 
+0

哦,我想我必须自己实现它:https://github.com/encode/django-rest-framework/blob/master/rest_framework/permissions.py#L91任何帮助在这里将不胜感激。 –

回答

0

哎哟,比我认为这是比较容易。

class BaseModelPerm(permissions.DjangoModelPermissions): 

    def get_custom_perms(self, method, view): 
      app_name = view.model._meta.app_label 
      return [app_name+"."+perms for perms in view.extra_perms_map.get(method, [])] 

    def has_permission(self, request, view): 
     perms = self.get_required_permissions(request.method, view.model) 
     perms.extend(self.get_custom_perms(request.method, view)) 
     return (
      request.user and 
      (request.user.is_authenticated() or not self.authenticated_users_only) and 
     request.user.has_perms(perms) 
    ) 

中,你可以使用如下

class ViewName(generic.ListApiView): 

     """ Trip listing view """ 

    model = model_name 
    serializer_class = serializer_class 
    permission_classes = (permissions.IsAuthenticated,BaseModelPerm) 
    queryset = model.objects.all() 
    extra_perms_map = { 
     'GET': ["can_view_trip"], 
    } 

添加要添加任何额外的权限视图。

0

您必须重写custome DjangoModelPermissions:

相关问题