【问题标题】:Django Restframework has_object_permission() function is not working for object permissionDjango Rest Framework has_object_permission() 函数不适用于对象权限
【发布时间】:2016-10-24 18:24:02
【问题描述】:

我正在调试我的自定义权限类并为我的 has_object_permission() 函数返回 False 值,但我仍然能够通过 Restframework 的 API 浏览器访问我的 API(GET 请求),而无需进行身份验证我不明白为什么。任何帮助将不胜感激。请看下面的代码。无论出于何种原因,我的 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

【问题讨论】:

    标签: python django


    【解决方案1】:

    Django Rest API Guide says:

    还要注意,通用视图只会检查检索单个模型实例的视图的对象级权限。如果您需要对列表视图进行对象级过滤,则需要单独过滤查询集。有关详细信息,请参阅filtering documentation

    rest_framework.generics.BulkModelViewSet,顾名思义,做批量操作。这意味着您必须使用文档中建议的对象级过滤。

    您应该特别关注this 部分。密切关注示例并使用代码。您还应该阅读DjangoModelPermissions 以了解上面链接中的示例是如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多