我在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的权限基于用户角色并且可以正常工作。问题在于文件字段的权限。它是 现在,拥有链接的任何人都可以访问。我需要对文件和附件端点具有相同的权限。
正确的做法是什么?
答案 0 :(得分:0)
我自己找到了解决方案。
首先,我使所有文件都无法通过URL访问。 然后,我创建了另一个端点-DownloadAttachmentViewSet。该视图集仅支持检索操作。 AttachmentViewSet现在将URL提供给DownloadAttachmentViewSet-detail,而不是实际的文件URL。运行检索方法时,它将返回FileResponse。
通过这种方式,我可以使用自定义权限和过滤的查询集来确保文件仅由我想要的用户下载。
对于某些只需要提供小文件的用户来说,QUick解决方案可以使用https://github.com/Hipo/drf-extra-fields并将其序列化为Base64。