2016-10-24 61 views
0

我在調試我的自定義權限類和我has_object_permission返回值爲False()函數的過程中來,但是我我仍然能夠訪問我的API(GET請求),通過Restframework的API瀏覽器無需驗證,我無法理解爲什麼。任何幫助將不勝感激。請參閱下面的代碼。無論出於什麼原因,看起來我的has_object_permission函數沒有執行。請幫助Django的Restframework has_object_permission()函數不工作的對象權限

urls.py

router = BulkRouter() 
router.register(r'api1', SimpleViewSet1) 


urlpatterns = [ 
    url(r'^test/', include(router.urls, namespace='api1')), 
] 

views.py

class SimpleViewSet1(generics.BulkModelViewSet):  
    queryset = Barcode.objects.all() 
    permission_classes = (MyUserPermission,) 
    serializer_class = SimpleSerializer1 


    def get_queryset(self): 
     user = User.objects.get(pk=2) 
     return Barcode.objects.filter(owner = user) 


    def get_object(self): 
     obj = get_object_or_404(self.get_queryset()) 
     self.check_object_permissions(self.request, obj) 
     return obj 

permissions.py

class MyUserPermission(BasePermission): 

    def has_permission(self, request, view): 
     return True 


    def has_object_permission(self, request, view, obj): 
     return False 

serializer.py

class SimpleSerializer1(BulkSerializerMixin, # only required in DRF3 
         ModelSerializer): 

    owner = serializers.ReadOnlyField(source='owner.username') 

    class Meta(object): 
     model = Barcode 
     # only required in DRF3 
     list_serializer_class = BulkListSerializer 
     fields = ('barcode_number', 'barcode_type', 'owner') 

models.py

@python_2_unicode_compatible 
class Barcode(models.Model): 
    owner = models.ForeignKey('auth.User', related_name = 'barcodes') 
    barcode_number = models.CharField(max_length=200) 
    barcode_type = models.CharField(max_length=200) 

    def __str__(self): 
     return self.barcode_number 

回答

1

Django Rest API Guide says

還要注意的是通用視圖將只檢查對象級權限對於檢索單個模型實例的看法。如果您需要列表視圖的對象級過濾,則需要單獨過濾查詢集。有關更多詳細信息,請參閱filtering documentation

rest_framework.generics.BulkModelViewSet,正如其名稱所暗示的那樣,執行批量操作。這意味着您必須使用文檔中建議的對象級過濾。

,你應該尋找特別是在this部分。密切關注該示例並利用該代碼。您還應該閱讀DjangoModelPermissions以瞭解上述鏈接中的示例如何工作。

相關問題