限制访问Django中的私有文件下载

dea*_*ase 13 python django django-file-upload

我的django应用程序中有多个FileFields,可以属于不同的用户.我正在寻找一种限制不是文件所有者的用户访问文件的好方法.

实现这一目标的最佳方法是什么?有任何想法吗?

Ser*_*eim 12

不幸的是,@ Mikko的解决方案实际上无法在生产环境中工作,因为django 不是为文件服务而设计的.在生产环境中,文件需要由HTTP服务器(例如apache,nginx等)提供,而不是由您的application/django服务器(例如uwsgi,gunicorn,mod_wsgi等)提供.

这就是限制文件访问的原因并不容易:您需要一种方法让HTTP服务器询问应用程序服务器是否可以将文件提供给请求它的特定用户.您可以理解这需要修改您的应用程序您的http服务器.

上述问题的最佳解决方案是django-sendfile(https://github.com/johnsensible/django-sendfile),它使用X-SendFile机制来实现上述功能.我正在复制项目的描述:

这是用于将文件发送到Web客户端的特定于Web服务器的方法的包装器.当Django需要检查权限相关文件但不想提供文件本身的实际字节时,这很有用.即服务大文件不是Django的用途.

要了解有关senfile机制的更多信息,请阅读以下答案:Django - 了解X-Sendfile

2018更新:请注意django-sendfile似乎不再维护; 可能它仍然应该工作但是如果你想要一个具有类似功能的更现代的包,请查看https://github.com/edoburu/django-private-storage作为评论者@ surfer190建议.特别要确保实现"优化大文件传输"部分; 你实际上需要这个所有传输不仅适用于大文件.

  • @surfer190 你提到的包现在似乎是一个很好的解决方案,因为 django-sendfile 似乎不再维护:( 我会更新答案以也包含这个包。但是请注意,当我第一次回答这个问题时 django-private -存储实际上并不存在! (2认同)