【问题标题】:Content negotiation with Django staticfiles in runserver在 runserver 中与 Django 静态文件进行内容协商
【发布时间】:2016-05-31 14:04:35
【问题描述】:

我正在使用staticfiles 在我的 Django 应用程序中管理静态文件(JS、CSS、图像等)。这工作正常,但我想在用户的浏览器有能力时启动dynamically serving pre-compressed sources

我浏览了链接的教程,并且在生产中(在 Apache 上)这工作正常。我可以使用

来包含文件
<script src="/static/js/my-site"></script>

当支持 GZip 编码时,它将在旧浏览器中加载 my-site.jsmy-site.js.gz。伟大的!但是:这会破坏使用runserver 的本地开发。当然,staticfiles 默认视图不知道如何将/js/my-site 转换为/js/my-site.js(或.gz)。要让runserver 工作,我需要指定扩展名,这会破坏内容协商。

有没有更好的方法来配置 Apache,以便我可以随时请求 .js(或 .css 等)并透明地获得压缩版本?或者我可以告诉 Django 如何在不指定扩展名的情况下找到请求的资源?我不认为我是唯一一个尝试这样做的人......

【问题讨论】:

  • 作为参考,我正在尝试 an alternative solution 使用 mod_rewrite 但对于我的生活,我无法让它真正为 gzip 文件提供服务。也许我需要一个关于 mod_rewrite 调试的单独问题?

标签: django apache


【解决方案1】:

没有简单的解决方案。主要是因为您使用的是专为 apache Web 服务器设计的东西(afaik)。

我认为有 3 个解决方案:

  1. 将源 .{js,css} 文件保存在单独的目录中,在开发中,您可以从源目录或压缩文件中提供它们 - 简单、透明,并且您可以将未压缩和未混淆的源隐藏在远离范围的地方
  2. 以 .min.{js,css} 结尾压缩文件 - 无需单独的目录,您可以在 apache 中隐藏源代码 (mod_rewrite)
  3. 编写您自己的小型中间件来模拟 apache 所做的事情(选择和重写路径只需几行代码,您甚至可以根据 DEBUG config var 有不同的行为)
  4. 使用一些动态解决方案,例如 Django Compressor,它将按需编译这些文件

(我正在使用选项 4 :))

【讨论】:

  • 其中一些没有完全解决问题。我需要 HTML 中的 something 来从不支持 gzip 编码的浏览器或压缩版本(如果可能)加载未压缩的脚本。当从 Apache 提供服务时,OP 中的示例非常适用。 #1 / #4 不提供这个。 #3 可以工作,但学习编写中间件现在不是优先事项。对于#2,正如我在上面评论的那样,我在使用 mod_rewrite 时遇到了问题,但从长远来看,它可能是最有希望的路径。
  • imo 如果浏览器不支持压缩 - 您的请求中没有标头,因此您不应在其上强制使用 gzip 压缩版本
  • 正是——这就是为什么 #1 和 #4 不是一个完整的解决方案,您仍然需要检查标题并决定提供哪个版本,即使 HTML 只要求一个名为资源。
猜你喜欢
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 2016-03-20
相关资源
最近更新 更多