Django Rest框架权限检查创建

时间:2015-12-04 01:21:10

标签: django django-rest-framework django-guardian

创建对象时,为什么没有django休息框架检查对象权限?用户应该能够创建一个他们无法查看,更新或删除的对象,这对我(无论如何)是没有意义的。目前我将视图集子类化为

class CheckCreatePermissionsViewSet(ModelViewSet):
    def perform_create(self, serializer):
    '''
    Called by create before calling serializer.save()
    '''
    obj = serializer.save()
    try:
        self.check_object_permissions(obj)
    except:
        obj.delete()
        raise

为什么默认不执行此操作?这对我来说引起了很大的麻烦,我无法想到它会像这样实施的一个原因。

3 个答案:

答案 0 :(得分:0)

如果您的意图是在用户没有特定权限的情况下不创建对象,则可以在Viewset中使用permission_classes,以便viewset甚至不允许用户创建对象。

为什么需要创建然后再根据权限删除?最好先检查权限,以便在权限失败时甚至不会创建对象。

例如,您只想要Admin创建对象,您可以添加 permission_classes=[permissions.IsAdminUser]到视图集,因此控件甚至不会进入perform_create。如果普通用户尝试创建对象,Viewset将发送403。希望这是你想要的。

答案 1 :(得分:0)

我发现在创建对象之前调用业务逻辑验证更自然和明确,而不是创建对象并确定用户是否可以看到它来删除它。

class CheckCreatePermissionsViewSet(ModelViewSet):
    def perform_create(self, serializer):
        try:
            business_rules_are_ok(serializer.data, user):
        except BusinessException:
            raise ValidationError(<content from BusinessException)
        serializer.save()

答案 2 :(得分:0)

在我的方法中,我使用perform_create来完成您建议的工作。 但是,我使用事务来处理它,而不是创建和删除它,代码是:

    <Grid ClipToBounds="True">
        <AdornerDecorator>
            <Rectangle Name="rec">
            <Rectangle.Fill>
                <VisualBrush Stretch="Uniform">
                    <VisualBrush.Visual>
                        <Grid Height="446" Width="595">
                            <Image Source="DSC00025.jpg" Stretch="Fill"/>
                            <Rectangle Height="30" Width="100" Fill="Green"
                                       VerticalAlignment="Top" HorizontalAlignment="Left"/>
                        </Grid>
                    </VisualBrush.Visual>
                </VisualBrush>
            </Rectangle.Fill>
            </Rectangle>
        </AdornerDecorator>
    </Grid>