Django-compressor: Tiene habilitada la compresión sin conexión, pero falta la clave en el manifiesto sin conexión

Creado en 1 dic. 2011  ·  17Comentarios  ·  Fuente: django-compressor/django-compressor

No estoy seguro de cuál es este problema, pero estoy usando la generación fuera de línea y este error ocurre después de usar el comando de administración de compresión y acceder al sitio web. ¿Debería cada uno de esos archivos css tener su propia clave?

Mi configuración:
COMPRESS_URL = STATIC_URL
COMPRESS_ROOT = STATIC_ROOT
COMPRESS_OFFLINE = Verdadero
COMPRESS_OFFLINE_MANIFEST = "manifest.json" # Se crea en el directorio CACHE
COMPRESS_CSS_FILTERS = ['compresor.filtros.css_predeterminado.CssAbsoluteFilter','compresor.filtros.cssmin.CSSMinFilter']
COMPRESS_YUI_BINARY = os.path.join(PROJECT_ROOT, 'bin/yui.sh')
COMPRESS_JS_FILTERS = ['compresor.filtros.cierre.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' # NO FUNCIONA WTF

Tiene habilitada la compresión sin conexión, pero falta la clave "b68ba4d2116295c56138e439f1b03a03" en el manifiesto sin conexión. Es posible que deba ejecutar "python manage.py compress".

Método de solicitud: OBTENER
URL de solicitud: http://127.0.0.1 :8000/
Versión Django: 1.3.1
Tipo de excepción: OfflineGenerationError
Valor de excepción:
Tiene habilitada la compresión sin conexión, pero falta la clave "b68ba4d2116295c56138e439f1b03a03" en el manifiesto sin conexión. Es posible que deba ejecutar "python manage.py compress".
Ubicación de excepción: /srv/www/project/lib/python2.6/site-packages/compressor/templatetags/compress.py en render_offline, línea 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>'}

Comentario más útil

Que pase lo mismo. No tiene ningún código en línea en compres, y la clave que informa que falta existe de hecho en manifest.json
Realmente no sé qué diablos está pasando, ¿alguien más todavía tiene esto? Todos los demás comentarios sobre esto son de hace un año.

Todos 17 comentarios

¿Qué versión de django_compressor estás usando?

Lo que sea que esté en PyPI. Intentaré actualizar a la última versión dev. Gracias

Tuve el mismo problema al mezclar scripts en línea con archivos incluidos.

Este fue mi código de plantilla.

{% 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 %}

Y estos eran los datos que usaba el compresor Django para generar una clave de manifiesto.

['\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']

La clave es un resumen de la representación de cadena de la lista de nodos dentro del bloque {% compress %} . Si esos datos varían cada vez que se analiza el bloque (consulte la dirección 0x23cf750 en el URLNode anterior), la carga de una página siempre generará una clave distinta de la que ha almacenado en su archivo de manifiesto.

En mi caso, eliminar el código en línea del bloque {% compress %} resolvió el problema.

Puede rastrear los datos y resumir en la función get_hexdigest de compressor.cache . Busque pistas en el registro de errores del servidor web/salida estándar.

Espero eso ayude,

Debería corregirse en la versión de desarrollo, gracias a la corrección que se realizó en el n. ° 154

Parece que el problema fue una secuencia de comandos incluida dentro de un bloque en línea. Esto estaba en la última versión de desarrollo. Gracias @viotti

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

Este problema probablemente debería cerrarse, como se señaló anteriormente aquí, es un duplicado del n. ° 154.

Hola, estoy sufriendo este problema. Mi configuración.py se ve así:

### 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'

Todo funciona bien, excepto por el código js en línea presente en el archivo .html. Tengo varios archivos externos css/js vinculados desde mi .html. Todos estos están bien comprimidos con {% compress css/js %}, pero cuando trato de comprimir todo el código js impreso en un archivo .html (código entre

Todavía tengo problemas con esto. Parece que incluso en la rama de desarrollo, usando {{ STATIC_URL }}, el proceso de generación hexadecimal está generando nuevos hexadecimales que no tienen ningún sentido o no corresponden a los hexadecimales guardados en manifest.json.

Solución: no haga que compress js abarque un bloque. Por ejemplo, use compress una vez en la plantilla maestra y una vez en las plantillas que cada una hereda. Desventaja: dos solicitudes http para css y js cada una, en lugar de una. Se puede reducir a uno moviendo el js/css maestro para que esté en todas las plantillas.

Sería bueno si no tuviéramos que elegir entre DRY en plantillas y reducir las solicitudes http :)

Que pase lo mismo. No tiene ningún código en línea en compres, y la clave que informa que falta existe de hecho en manifest.json
Realmente no sé qué diablos está pasando, ¿alguien más todavía tiene esto? Todos los demás comentarios sobre esto son de hace un año.

@altryne : podría ser un problema de permisos, verifique que el servidor web/proceso django tenga los derechos para leer el manifiesto. No puedo ayudar mucho más sin más detalles.

Resulta que era una cosa de Django con una página de 500. Con la compresión fuera de línea, Django intentó renderizar la página 500 sin contexto, lo que en sí mismo creó el error 500.

Esto realmente ayudó:
http://chriskief.com/2013/09/18/django-compressor-offlinegenerationerror-and-500-html-handler500/

Hola a todos, el enlace a chriskief.com fue útil. Sin embargo, no me solucionó el problema. Resultó que tenía variables de plantilla de django como "{{myvar}}" en mis javascripts. Olvidé agregarlos a COMPRESS_OFFLINE_CONTEXT y, por lo tanto, obtuve el error de clave faltante. Una vez que saqué todos mis javascripts con variables de plantilla del compresor, todo volvió a funcionar bien. Antes recibí un error 500 que no mostraba el error estándar de django sino la "página de configuración incorrecta" de Apache. Todavía no estoy seguro, si solo las definiciones que faltan en COMPRESS_OFFLINE_CONTEXT son el problema o si también {% url ... %} causa este problema.

Estoy viendo esto en mi implementación. Yo uso compresas así

{% 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 %}

¿Podría ser que compress no pueda procesar la etiqueta sass_src ?

¿Fue útil esta página
0 / 5 - 0 calificaciones