【问题标题】:How to use django-compressor with apache?如何在 apache 中使用 django-compressor?
【发布时间】:2012-04-13 18:17:56
【问题描述】:

我一直在使用 Django Compressor 来管理我的 coffee/less 文件,它非常适合开发,但我遇到了一些问题,使其无法用于我的生产部署。

我的想法是让 apache 来托管静态文件,可能在另一台服务器上。我在settings.py 文件上设置COMPRESS_OFFLINE = True

然后我执行以下操作

  • python manage.py compress - 这会填充我的 static 目录中的 CACHE 目录,所有静态文件都将收集到该目录中。
  • python manage.py collectstatic - 这会将我项目中所有应用程序(其中一些不使用压缩器)的静态文件收集到我的static 目录中。
  • static 目录复制到某处以使用apache 托管。并设置 apache 来提供文件。
  • 修改settings.py文件中的static_url变量指向静态服务器。

如果我打开任何页面,我的服务器上会出现以下错误,这似乎只发生在我的 settings.py 文件中有 DEBUG = FalseCOMPRESS_OFFLINE = True 时:

TemplateSyntaxError:渲染时捕获 OfflineGenerationError: 您启用了离线压缩,但密钥 脱机清单中缺少“777ba26736d046ab043dc151e7e9a060”。 您可能需要运行“python manage.py compress”。

当我检查static/CACHE 目录时,我确认错误内容,这是我的manifest.json 文件:

{
  "6189b8598993d1cbdbd35d4dfd1a6711": "<script type=\"text/javascript\" src=\"http://192.168.1.123/CACHE/js/2f6ca6616bd6.js\"></script>",
  "5c66dbed0e5b766c6e32773cd8585f3c": "<link rel=\"stylesheet\" href=\"http://192.168.1.123/CACHE/css/154d95903951.css\" type=\"text/css\" />"
}

如果我删除 CACHE 目录并重新运行 python manage.py compress,我会在错误消息和清单文件中获得一组新的 ID,但清单上仍然缺少错误中的 ID。

所以,我想这里有两个问题。为什么它不起作用?实现这一目标的正确方法是什么?

谢谢。

【问题讨论】:

  • 你在设置中STATICFILES_FINDERS有压缩器查找器吗?
  • 请在您使用{% compress %}标签的地方显示您的模板代码,这将有助于调试TemplateSyntaxError :)

标签: django apache django-compressor


【解决方案1】:

如果你运行了压缩,你仍然会收到消息

OfflineGenerationError:您启用了离线压缩,但离线清单中缺少密钥“4971a40e3b459a8cda8287a7f7caa96d”。您可能需要运行“python manage.py compress”

那么很可能你在压缩标签中有动态内容。确保 compress 始终是最里面的块,并且 compress 块内没有标签。

【讨论】:

  • 致来自 Google 的未来人士:在压缩标签中包含动态内容(例如 {% compress css %}{% if bootstrap %})可能会以各种奇怪的方式导致 OfflineGenerationError - 仅适用于您网站的某些用户,即使他们应该获得相同的模板!我最初忽略了这个答案,因为我的情况只适用于某些用户,但那是我自己的危险。这就是答案。
【解决方案2】:

我猜你正在使用不支持静态模板标签 {% static "..." %} 的 django-compressor 1.1.2。

尝试安装 django-compressor 的开发版:

pip install django_compressor==dev

应该能解决问题。

【讨论】:

    【解决方案3】:

    David Wolfe 是绝对正确的:必须挖掘我的所有代码才能摆脱 {% trans... 等。 我是这样设计的:

    <script>
    window.__enter_email = "{% trans "Enter correct email" %}"
    window.__url = "{% url "shop:go" %}"
    </script>
    {% compress js %}
    <script>
    $("#bla")..... window.__enter_email ...
    </script>
    {% endcompress %}
    

    希望,帮助别人!

    【讨论】:

    • 谢谢,我将 David 的回复标记为已接受。我没有测试过它(我已经很多年没有做过这个工作了),但根据赞成票和你的评论,它似乎是一个很好的解决方案。
    猜你喜欢
    • 2015-08-22
    • 1970-01-01
    • 2017-11-17
    • 2017-04-11
    • 2013-02-09
    • 2011-12-06
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多