创建对象时,为什么没有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
为什么默认不执行此操作?这对我来说引起了很大的麻烦,我无法想到它会像这样实施的一个原因。
答案 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>