25
我一直在使用Django进行一些有关使用访问控制的文件下载的研究。我的目标是完全阻止访问文件,除非特定用户访问。我读过使用Django时,X-Sendfile是实现此目标的方法之一(基于其他SO问题等)。我用X-SENDFILE和Django的基本理解是:Django - 了解X-Sendfile
- 用户请求的URI得到一个受保护的文件
- Django应用程序决定返回基于URL的文件,并检查用户权限等
- Django应用程序返回一个HTTP响应,其'X-Sendfile'头部设置为服务器的文件路径
- Web服务器找到该文件并将其返回给请求者(我假设Web服务器也会去掉'X-Sendfile'头一路)
与直接从Django中直接抓取文件相比,X-Sendfile似乎是实现受保护下载的更有效方法(因为我可以依靠Nginx来为Django提供文件),但是给我留下了两个问题:
- 我对X-Sendfile的解释至少是抽象的正确吗?
- 假设我没有提供正常的前端HTTP访问(例如http://www.example.com/downloads/secret-file.jpg)到文件存储目录(即,不保留在我的
public_html
目录中),它真的很安全吗?或者,技术精通的用户可以检查标题等,并反向设计访问文件的方式(然后分发)? - 真的是一个很大的差异性能。我是否会通过直接从Django提供8b块大小的150Mb文件下载来让应用程序服务器停止运行,或者这是一个非问题?我问的原因是因为如果两个版本差不多,那么Django版本会更好一些,因为我可以在Python中执行某些操作,例如记录下载完成的数量,记录下载带宽等。
提前。
在上面列出的步骤中,有一件事对我并不清楚:当您说'Django应用程序返回带有X-Sendfile头集的HTTP响应时,谁是该响应的接收者?我想这将是网络服务器(例如nginx)。如果是这样的话,谁首先发起了由Django应用程序处理的请求? – MLister
@MLister - 用户(网络浏览器) - 基本上,您希望设置一个类似于“get_file(request,file_name)”的视图(这个效果),当用户访问URL时,返回一个响应, X-Sendfile“指向指定文件的正确位置(在视图中添加所需的任何逻辑以确定是否允许用户下载文件)。Nginx会拦截响应,并返回一个响应(作为下载)。 – orokusaki
那么'nginx'必须设置在* Django应用服务器的前面呢?否则,'nginx'如何拦截响应呢? – MLister