Django-compressor: 您启用了离线压缩,但离线清单中缺少密钥

创建于 2011-12-01  ·  17评论  ·  资料来源: django-compressor/django-compressor

我不确定这个问题是什么,但我正在使用离线生成,并且在使用压缩管理命令并访问网站后会发生此错误。 这些css文件中的每一个都应该有自己的密钥吗?

我的设置:
COMPRESS_URL = STATIC_URL
COMPRESS_ROOT = STATIC_ROOT
COMPRESS_OFFLINE = 真
COMPRESS_OFFLINE_MANIFEST = "manifest.json" # 在 CACHE 目录下创建
COMPRESS_CSS_FILTERS = ['compressor.filters.css_default.CssAbsoluteFilter','compressor.filters.cssmin.CSSMinFilter']
COMPRESS_YUI_BINARY = os.path.join(PROJECT_ROOT, 'bin/yui.sh')
COMPRESS_JS_FILTERS = ['compressor.filters.closure.ClosureCompilerFilter']
COMPRESS_CLOSURE_COMPILER_BINARY = os.path.join(PROJECT_ROOT, 'bin/closure.sh')
COMPRESS_CLOSURE_COMPILER_ARGUMENTS = "--language_in=ECMASCRIPT5"

COMPRESS_STORAGE = 'compressor.storage.GzipCompressorFileStorage' # 不工作 WTF

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

请求方法:GET
请求网址:http: //127.0.0.1 :8000/
Django 版本:1.3.1
异常类型:OfflineGenerationError
异常值:
您启用了离线压缩,但离线清单中缺少密钥“b68ba4d2116295c56138e439f1b03a03”。 您可能需要运行“python manage.py compress”。
异常位置:render_offline 中的 /srv/www/project/lib/python2.6/site-packages/compressor/templatetags/compress.py 第 56 行

Variable    Value
forced  
False
self    
<compressor.templatetags.compress.CompressorNode object at 0x966764c>
compressor  
<compressor.js.JsCompressor object at 0x966732c>
key 
'b68ba4d2116295c56138e439f1b03a03'
offline_manifest    
{u'32e9172ad82f3b6d238cc7423a7f10c7': u'<link rel="stylesheet" href="/static/CACHE/css/a50381ce7ba9.css" type="text/css" media="screen" /><link rel="stylesheet" href="/static/CACHE/css/62afac347423.css" type="text/css" /><link rel="stylesheet" href="/static/CACHE/css/f336d54a5423.css" type="text/css" media="screen" /><link rel="stylesheet" href="/static/CACHE/css/5cf783d07673.css" type="text/css" />',
 u'b1bd8f68f96dfa53380b10881f8eb691': u'<script type="text/javascript" src="/static/CACHE/js/19522c6ee302.js"></script>',
 u'c6d6d2948d18188277e7a987c71e2bc3': u'<script type="text/javascript" src="/static/CACHE/js/90bda37980a5.js"></script>',
 u'dbe0b22545cd64193d8a875c3226b1ea': u'<script type="text/javascript" src="/static/CACHE/js/71056921eb77.js"></script>'}

最有用的评论

有同样的事情发生。 compress中没有内联代码,报缺失的key其实存在于manifest.json中
真不知道这是怎么回事,还有人有这个吗? 关于此的所有其他评论均来自一年前

所有17条评论

你使用的是什么版本的 django_compressor?

PyPI 中的任何内容。 我会尝试升级到最新的开发版本。 谢谢

通过将内联脚本与包含文件混合,我遇到了同样的问题。

这是我的模板代码。

{% compress js %}
    <script type="text/javascript">
    xhr_cidades = '{% url cidades_consulta %}';
    xhr_imoveis = '{% url imoveis_consulta %}';
    xhr_empresas = '{% url empresas_consulta %}';
    xhr_empreend = '{% url empreendimentos_consulta %}';
    </script>

    <script type="text/javascript" src="{{ STATIC_URL }}jquery-1.6.1.min.js"></script>
    <script type="text/javascript" src="{{ STATIC_URL }}jquery-ui/jquery-ui-1.8.13.custom.min.js"></script>
    <script type="text/javascript" src="{{ STATIC_URL }}jquery-ui/jquery-ui-datepicker-pt-BR.min.js"></script>
    <script type="text/javascript" src="{{ STATIC_URL }}jquery-ui/jquery-ui-combobox.min.js"></script>
    <script type="text/javascript" src="{{ STATIC_URL }}jquery-meiomask-1.1.3.min.js"></script>
    <script type="text/javascript" src="{{ STATIC_URL }}jquery-scrollto-1.4.2.min.js"></script>
    <script type="text/javascript" src="{{ STATIC_URL }}jquery-dotimeout-1.0.min.js"></script>
    <script type="text/javascript" src="{{ STATIC_URL }}base.js"></script>
{% endcompress %}

这是 Django 压缩器用来生成清单密钥的数据。

['\n    <script type="text/javascript">\n        xhr_cidades = \'', '<django.template.defaulttags.URLNode object at 0x23cf1d0>',
 "';\n        xhr_imoveis = '", '<django.template.defaulttags.URLNode object at 0x23cf750>', "';\n        xhr_empresas = '",
 '<django.template.defaulttags.URLNode object at 0x23cf210>', "';\n        xhr_empreend = '",
 '<django.template.defaulttags.URLNode object at 0x23cf2d0>', '\';\n    </script>\n\n    <script type="text/javascript" src="',
 '<Variable Node: STATIC_URL>', 'jquery-1.6.1.min.js"></script>\n    <script type="text/javascript" src="', '<Variable Node:
 STATIC_URL>', 'jquery-ui/jquery-ui-1.8.13.custom.min.js"></script>\n    <script type="text/javascript" src="', '<Variable
 Node: STATIC_URL>', 'jquery-ui/jquery-ui-datepicker-pt-BR.min.js"></script>\n    <script type="text/javascript" src="',
 '<Variable Node: STATIC_URL>', 'jquery-ui/jquery-ui-combobox.min.js"></script>\n    <script type="text/javascript" src="',
 '<Variable Node: STATIC_URL>', 'jquery-meiomask-1.1.3.min.js"></script>\n    <script type="text/javascript" src="',
 '<Variable Node: STATIC_URL>', 'jquery-scrollto-1.4.2.min.js"></script>\n    <script type="text/javascript" src="', '<Variable
 Node: STATIC_URL>', 'base.js"></script>\n']

关键是{% compress %}块内节点列表的字符串表示形式的摘要。 如果每次解析块时该数据都不同(请参阅上面 URLNode 上的0x23cf750地址),则页面加载将始终生成与您存储在清单文件中的内容不同的密钥。

就我而言,从{% compress %}块中删除内联代码解决了这个问题。

您可以在compressor.cacheget_hexdigest函数中跟踪数据和摘要。 在标准输出/Web 服务器错误日志中寻找线索。

希望能帮助到你,

由于 #154 中的修复,它应该在开发版本中得到修复

看起来问题是包含在内联块中的脚本。 这是最新的开发版本。谢谢@viotti

{% compress js inline %}
<script type="text/javascript" src="/static/js/pages/calculator.js"></script>

这个问题可能应该关闭,如前所述,它是 #154 的副本。

嗨,我正在遭受这个问题。 我的 settings.py 看起来像这样:

### COMPRESSION - django_compressor
COMPRESS_ENABLED = True
COMPRESS_OFFLINE = True
COMPRESS_PARSER = 'compressor.parser.LxmlParser'
COMPRESS_CSS_FILTERS = [
    'compressor.filters.css_default.CssAbsoluteFilter',
    'compressor.filters.cssmin.CSSMinFilter',
    ]
COMPRESS_JS_FILTERS = [
    'compressor.filters.closure.ClosureCompilerFilter',
]

COMPRESS_CLOSURE_COMPILER_BINARY = 'java -jar /path/to/compiler.jar'

除了 .html 文件中存在的内联 js 代码外,一切正常。 我有几个从我的 .html 链接的 css/js 外部文件。 所有这些都用 {% compress css/js %} 很好地压缩了,但是当我尝试压缩打印在 .html 文件中的所有 js 代码时(代码之间

仍然有这个问题。 似乎即使在 dev 分支中,使用 {{ STATIC_URL }},十六进制生成过程也在生成没有任何意义或对应于 manifest.json 中保存的十六进制的新十六进制。

解决方案:不要压缩 js 跨越一个块。 例如,在主模板中使用一次压缩,在各自继承的模板中使用一次。 缺点:每个对 css 和 js 的两个 http 请求,而不是一个。 可以通过将主 js/css 移动到所有模板中来减少到一个。

如果我们不必在模板中的 DRY 和减少 http 请求之间进行选择,那就太好了:)

有同样的事情发生。 compress中没有内联代码,报缺失的key其实存在于manifest.json中
真不知道这是怎么回事,还有人有这个吗? 关于此的所有其他评论均来自一年前

@altryne :可能是权限问题,请验证 webserver / django 进程是否有权读取清单。 没有更多的细节就帮不上什么忙了。

原来这是一个有 500 页的 Django 东西。 在离线压缩的情况下,django 尝试在没有上下文的情况下渲染 500 页面,这本身就产生了 500 错误。

这确实有帮助:
http://chriskief.com/2013/09/18/django-compressor-offlinegenerationerror-and-500-html-handler500/

大家好, chriskief.com 的链接很有帮助。 但是,它并没有为我解决问题。 事实证明,我的 javascript 中有像“{{myvar}}”这样的 django 模板变量。 我忘记将它们添加到 COMPRESS_OFFLINE_CONTEXT 中,因此我得到了缺少密钥的错误。 一旦我从压缩器中取出所有带有模板变量的 javascript,一切都会再次正常运行。 在我得到一个 500 错误之前,它没有显示标准的 django 错误,而是 Apache“错误配置页面”。 我还不确定,是否只是 COMPRESS_OFFLINE_CONTEXT 中缺少定义是问题,或者 {% url ... %} 是否也会导致此问题。

我在部署中看到了这一点。 我像这样使用压缩

{% compress css %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'css/bootstrap-social.css' %}">
<link rel="stylesheet" type="text/css" href="{% sass_src 'css/base.scss' %}">
{% endcompress %}

可能是 compress 无法处理sass_src标签吗?

此页面是否有帮助?
0 / 5 - 0 等级