2012-04-13 17 views
5

He estado usando Django Compressor para administrar mis archivos de café/menos y es excelente para el desarrollo, pero he tenido algunos problemas para hacerlo funcionar para mi implementación de producción.Cómo usar django-compressor con apache?

Mi idea es tener apache para alojar los archivos estáticos, posiblemente en otro servidor. Estoy configurando COMPRESS_OFFLINE = True en el archivo settings.py.

Entonces haga lo siguiente

  • python manage.py compress - Este puebla el directorio CACHE en mi directorio static, donde se recogerán todos los archivos estáticos.
  • python manage.py collectstatic - Esto recolecta archivos estáticos de todas las aplicaciones en mi proyecto (algunas de las cuales no usan compresor) en mi directorio static.
  • Copie el directorio static en algún lugar para hospedarlo con apache. Y configura apache para servir los archivos.
  • Modifique la variable static_url en el archivo settings.py para apuntar al servidor estático.

Si abro cualquier página, me sale el siguiente error en mi servidor, esto sólo parece ocurrir cuando tengo DEBUG = False y COMPRESS_OFFLINE = True en mi settings.py archivo:

TemplateSyntaxError: Caught OfflineGenerationError while rendering: You have offline compression enabled but key "777ba26736d046ab043dc151e7e9a060" is missing from offline manifest. You may need to run "python manage.py compress".

Cuando compruebo el directorio static/CACHE , confirmo lo que dice el error, este es mi manifest.json archivo:

{ 
    "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\" />" 
} 

Si elimino el directorio de caché y volver a ejecutar python manage.py compress, obtengo un nuevo conjunto de ID tanto en el mensaje de error como en el archivo de manifiesto, pero la identificación en el error todavía falta en el manifiesto.

Entonces, supongo que hay dos preguntas aquí. ¿Por qué no está funcionando? ¿Cuál es la forma correcta de lograr esto?

Gracias.

+0

¿Tiene el buscador del compresor en 'STATICFILES_FINDERS' en la configuración? – ilvar

+0

Muestre su código de plantilla donde usa la etiqueta '{% compress%}', que ayudaría a depurar 'TemplateSyntaxError' :) – vdboor

Respuesta

15

Si se le han acabado compresa, y sigue recibiendo el mensaje

OfflineGenerationError: You have offline compression enabled but key "4971a40e3b459a8cda8287a7f7caa96d" is missing from offline manifest. You may need to run "python manage.py compress"

entonces es probable que usted tiene contenido dinámico dentro de comprimir las etiquetas. Asegúrese de que la compresión sea siempre el bloque más interno y de que no haya etiquetas dentro del bloque de compresión.

+1

A futuras personas de Google: tener contenido dinámico dentro de las etiquetas de compresión (por ejemplo' {% compress css %} {% si bootstrap%} ') puede causar OfflineGenerationError en todo tipo de formas extrañas, incluso solo para algunos usuarios de su sitio, ¡aunque deberían recibir las mismas plantillas! Inicialmente descarté esta respuesta porque mi situación solo se aplicaba a algunos usuarios, pero eso fue bajo mi propio riesgo. Esta fue la respuesta. – kqr

3

Supongo que está utilizando django-compressor 1.1.2 que no admite la etiqueta de plantilla estática {% static "..."%}.

prueba a instalar la versión dev de django-compresor con:

pip install django_compressor==dev

Debe resolver el problema.

0

David Wolfe tiene toda la razón: había que cavar entre TODAS las del código de la mina para deshacerse de {% trans ... etc que hacerlo de esta manera:

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

Esperanza, ayuda a alguien!

+0

Gracias, marqué la respuesta de David como aceptada. No lo he probado (no he trabajado en esto durante años), pero basado en los votos al alza y su comentario, parece ser la buena solución. –