使用与 Django REST 中的端点相同的权限保护端点中的文件

Secure a file in endpoint with the same permissions as the endpoint in Django REST

我在 Django REST 框架中有一个项目,模型如下

class Attachment
    attachment_type = models.PositiveSmallIntegerField(choices=constants.AttachmentTypes.CHOICES)
    creator = models.ForeignKey(User, related_name="attachments", on_delete=models.PROTECT)
    file = models.FileField(upload_to='uploads/%Y/%m/%d/', max_length=511)
    name = models.CharField(max_length=255)
    size = models.CharField(max_length=30)

和 ModelViewSet 使用具有自定义权限的模型

class AttachmentViewSet(viewsets.ModelViewSet):
    queryset = models.Attachment.objects.all() 

此 ViewSet 的权限基于用户角色并且工作正常。问题在于文件字段的权限。这是 现在任何拥有 link 的人都可以访问。我需要与附件端点相同的文件权限。

正确的做法是什么?

我自己找到了解决办法。

起初我通过 URL 使所有文件都无法访问。 然后我创建了另一个端点 - DownloadAttachmentViewSet。此视图集仅支持检索操作。 AttachmentViewSet 现在提供 URL 到 DownloadAttachmentViewSet-detail 而不是实际文件 URL。当检索方法为 运行 时,它 returns FileResponse。

通过这种方式,我可以使用自定义权限和过滤查询集来确保文件仅由我想要的用户下载。

对于只需要提供小文件的用户来说,快速解决方案可以是使用 https://github.com/Hipo/drf-extra-fields 并将它们序列化为 Base64。