当前位置: 首页 > 面试题库 >

Django-了解X-Sendfile

丘浩宕
2023-03-14
问题内容

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

  1. 用户请求URI以获取受保护的文件
  2. Django应用程序根据URL决定返回哪个文件,并检查用户权限等。
  3. Django应用返回HTTP响应,其中“ X-Sendfile”标头设置为服务器的文件路径
  4. Web服务器找到文件并将其返回给请求者(我假设Web服务器也沿途剥离了“ X-Sendfile”标头)

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

  1. 我对X-Sendfile的解释至少抽象地正确吗?
  2. 假设我不提供对文件存储目录(例如,don)的常规前端HTTP访问(例如http://www.example.com/downloads/secret-file.jpg),它是否真的安全?不能将其保存在我的public_html目录中)?或者,精通技术的用户可以检查标头等,然后对访问文件(然后分发)的方式进行反向工程吗?
  3. 在性能上真的有很大的不同吗?我是否要通过直接从Django提供8b分块下载150Mb文件来停止我的应用程序服务器,还是这不是问题?我问的原因是因为如果两个版本几乎相等,则Django版本将是更可取的,因为我可以使用Python进行处理,例如记录已完成的下载次数,下载的计数带宽等。

提前致谢。


问题答案:
  1. 是的,这就是它的工作原理
  2. 确切的实现取决于Web服务器,但是对于Nginx,建议将位置标记为内部,以防止外部访问。
  3. Nginx可以异步处理文件,而使用Django时,每个请求需要一个线程,这可能会导致大量并行请求出现问题。

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



 类似资料:
  • 问题内容: 我正在运行Django Debug Toolbar(Django调试工具栏)来分析我的网站,并试图弄清为什么某些视图需要这么长时间。关于查看我正在运行的查询以及它们花了我多少钱,这是非常有价值的,但是我不明白如何阅读时间面板。 我到处都在寻找关于此的一些文档,但是似乎什么也找不到。我应该提到我是一个自学成才的,相对较新的程序员,因此这些可能是有经验的程序员所熟悉的术语。 这是输出: 谁

  • 本文向大家介绍简单了解django orm中介模型,包括了简单了解django orm中介模型的使用技巧和注意事项,需要的朋友参考一下 什么是中介模型 中介模型针对的是ManyToMany(多对多)的时候第三张表的问题, 中介模型其实指的就是我们不通过Django创建第三张表,如果自己不创建第三张表,而是由django给我们创建,那就不存在中介模型 中介模型示例 普通的ManyToMany示例 这

  • 问题内容: 我有一个我不明白的错误! 无法导入名称项目 在我的模型中,我有项目。这些项是操作所必需的。但是其中一些项目会影响操作: 项目 行动 效果 问题答案: 你的代码中有循环导入,这就是为什么无法实际导入Item的原因。 你可以通过删除其中一个文件中的类导入并将其替换为包含该类名称的字符串来解决该问题。例如 :

  • 问题内容: 在JSLint中,它警告说 (这不是一个真实的变量名)应该是 第一种语法有什么问题?该建议背后的原因是什么? 问题答案: 使用[]它比使用更加安全new Array(),因为您实际上可以覆盖ArrayJavaScript中的值: 换句话说,[]是明确的。

  • 问题内容: 我想在Mac OS X上的docker中运行Django应用。我已使用该教程安装了docker 。 我参考docker -library中的Django文档来构建映像https://github.com/docker- library/docs/tree/master/django ,我将Dockerfile添加到新的Django项目文件夹中 问题是我构建了映像并成功运行了容器,但是每

  • 问题内容: 我不太清楚该在哪里抛出该异常。 例如,我正在实现接口,并且不希望任何人调用该方法: Future#get(long,TimeUnit)。 所以,我可以扔吗? 事情是方法的规范并没有说明抛出异常。反过来,例外 抛出以指示不支持请求的操作。 类UnsupportedOperationException 我的意思是,如果您不希望调用它,通常会抛出它,否则可能会因为不是所有方法都已实现而被认为