2016-05-31 54 views
1

我在使用staticfiles管理Django应用程序中的静态文件(JS,CSS,图像等)。这工作正常,但我想在用户浏览器可用时启动dynamically serving pre-compressed sources在runserver中使用Django staticfiles进行内容协商

我经历了链接教程,并在生产(在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如何查找请求的资源而不指定扩展名?我不认为我是唯一一个试图做到这一点的人...

+0

作为参考,我尝试[一种替代解决方案](http://stackoverflow.com/questions/9076752/how-to-force-apache-to-use-manually-pre-compressed-gz-file-of-css-and-js-files )使用'mod_rewrite',但对于我的生活,我无法得到它实际服务gzip'd文件。也许我需要一个关于'mod_rewrite'调试的单独问题? – Coderer

回答

1

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

我我看来有三种解决方案:

  1. 保留源{JS,CSS}在不同的目录中的文件,在发展中你可以从源代码目录为他们服务或压缩一个 - 简单,透明,就可以了。使用.min。{js,css}结尾压缩文件
  2. - 不需要单独的目录,你可以在apache中隐藏源代码(mod_rewrite)
  3. 编写你自己的小型中间件,它将模拟apache所做的事情(这是几行选择和重写路径,你甚至可以有不同的根据DEBUG配置变种NT行为)
  4. 使用一些动态的解决方案如Django Compressor这将汇编点播这些文件

(我使用选项4 :))

+0

其中一些并未完全解决该问题。我需要HTML中的* something *,以便从不支持gzip编码的浏览器或可能的压缩版本加载未压缩的脚本。 OP提供的示例在Apache中提供服务时非常有用。 #1 /#4不提供这个。 #3可以工作,但学习编写中间件现在不是优先考虑的事情。对于#2,正如我上面评论的那样,我在使用mod_rewrite时遇到了问题,但从长远来看,这可能是最有希望的途径。 – Coderer

+0

imo如果浏览器不支持压缩 - 你在请求中没有标题,所以你不应该在它们上强制使用gzipped版本。 – Jerzyk

+0

准确地说 - 这就是为什么#1和#4不是一个完整的解决方案,你仍然需要一些东西检查标题并决定要提供哪个版本,即使HTML只需要一个指定的资源。 – Coderer