2017-10-05 106 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:

相關問題