2011-09-04 90 views
25

我一直在使用Django进行一些有关使用访问控制的文件下载的研究。我的目标是完全阻止访问文件,除非特定用户访问。我读过使用Django时,X-Sendfile是实现此目标的方法之一(基于其他SO问题等)。我用X-SENDFILE和Django的基本理解是:Django - 了解X-Sendfile

  1. 用户请求的URI得到一个受保护的文件
  2. Django应用程序决定返回基于URL的文件,并检查用户权限等
  3. Django应用程序返回一个HTTP响应,其'X-Sendfile'头部设置为服务器的文件路径
  4. Web服务器找到该文件并将其返回给请求者(我假设Web服务器也会去掉'X-Sendfile'头一路)

与直接从Django中直接抓取文件相比,X-Sendfile似乎是实现受保护下载的更有效方法(因为我可以依靠Nginx来为Django提供文件),但是给我留下了两个问题:

  1. 我对X-Sendfile的解释至少是抽象的正确吗?
  2. 假设我没有提供正常的前端HTTP访问(例如http://www.example.com/downloads/secret-file.jpg)到文件存储目录(即,不保留在我的public_html目录中),它真的很安全吗?或者,技术精通的用户可以检查标题等,并反向设计访问文件的方式(然后分发)?
  3. 真的是一个很大的差异性能。我是否会通过直接从Django提供8b块大小的150Mb文件下载来让应用程序服务器停止运行,或者这是一个非问题?我问的原因是因为如果两个版本差不多,那么Django版本会更好一些,因为我可以在Python中执行某些操作,例如记录下载完成的数量,记录下载带宽等。

提前。

+0

在上面列出的步骤中,有一件事对我并不清楚:当您说'Django应用程序返回带有X-Sendfile头集的HTTP响应时,谁是该响应的接收者?我想这将是网络服务器(例如nginx)。如果是这样的话,谁首先发起了由Django应用程序处理的请求? – MLister

+0

@MLister - 用户(网络浏览器) - 基本上,您希望设置一个类似于“get_file(request,file_name)”的视图(这个效果),当用户访问URL时,返回一个响应, X-Sendfile“指向指定文件的正确位置(在视图中添加所需的任何逻辑以确定是否允许用户下载文件)。Nginx会拦截响应,并返回一个响应(作为下载)。 – orokusaki

+0

那么'nginx'必须设置在* Django应用服务器的前面呢?否则,'nginx'如何拦截响应呢? – MLister

回答

19
  1. 是的,这就是它的工作原理。
  2. 确切的实现取决于网络服务器,但在nginx的情况下,建议将位置标记为内部以防止外部访问。
  3. Nginx可以在使用Django时异步提供文件,每个请求只需要一个线程,这对于更多数量的并行请求可能会产生问题。

请记住为nginx而不是X-Sendfile发送X-Accel-Redirect标头。 有关更多信息,请参阅http://wiki.nginx.org/XSendfile