2012-04-13 12 views
5

Utilizzo il compressore Django per gestire il mio caffè/meno file ed è ottimo per lo sviluppo, ma ho avuto alcuni problemi per farlo funzionare per la mia implementazione di produzione.Come usare django-compressor con apache?

La mia idea è di avere apache per ospitare i file statici, possibilmente in un altro server. Sto impostando COMPRESS_OFFLINE = True sul file settings.py.

poi faccio la seguente

  • python manage.py compress - Questo popola la directory CACHE nel mio static directory, in cui saranno raccolti tutti i file statici.
  • python manage.py collectstatic - Raccoglie file statici da tutte le app del mio progetto (alcuni dei quali non utilizzano il compressore) nella mia directory static.
  • Copia la directory static da qualche parte per essere ospitata con apache. E imposta apache per servire i file.
  • Modificare la variabile static_url nel file settings.py in modo che punti al server statico.

Se apro qualsiasi pagina, ottengo il seguente errore sul mio server, questo sembra accadere solo quando ho DEBUG = False e COMPRESS_OFFLINE = True sul mio settings.py lima:

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".

Quando controllo la directory static/CACHE , confermo quello che dice l'errore, questo è il mio manifest.json di file:

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

Se cancello la directory di cache e rieseguire 012.343., ottengo un nuovo set di ID sia sul messaggio di errore che sul file manifest, ma l'ID sull'errore è ancora mancante sul manifest.

Quindi, immagino ci siano due domande qui. Perché non funziona? Qual è il modo corretto per raggiungere questo obiettivo?

Grazie.

+0

Avete trovato il finder del compressore in 'STATICFILES_FINDERS' nelle impostazioni? – ilvar

+0

Si prega di mostrare il codice del modello in cui si utilizza il tag '{% comprimere%}', questo aiuterebbe a eseguire il debug di 'TemplateSyntaxError' :) – vdboor

risposta

15

Se si è a corto impacco, ed è ancora ottenere il messaggio

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

allora è probabile che si dispone di contenuti dinamici all'interno di comprimere i tag. Assicurati che compress sia sempre il blocco più interno e che non ci siano tag all'interno del blocco di compressione.

+1

Per le persone future di Google: avere contenuto dinamico all'interno dei tag di compressione (ad esempio' {% comprime css %} {% if bootstrap%} ') può causare OfflineGenerationError in tutti i tipi di modi strani - incluso solo per alcuni utenti del tuo sito anche se dovrebbero essere serviti gli stessi modelli! Inizialmente ho ignorato questa risposta perché la mia situazione si applicava solo ad alcuni utenti, ma questo era a mio rischio e pericolo. Questa era la risposta. – kqr

3

Immagino che tu stia utilizzando django-compressor 1.1.2 che non supporta il tag template statico {% static "..."%}.

provare a installare la versione dev di django-compressore con:

pip install django_compressor==dev

Si dovrebbe risolvere il problema.

0

David Wolfe ha assolutamente ragione: dovuto scavare throught tutto il codice di mine per sbarazzarsi di {% trans ... ecc faccio così:

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

Speranza, aiuta qualcuno!

+0

Grazie, ho contrassegnato la risposta di David come accettata. Non l'ho testato (non ho lavorato su questo per anni), ma sulla base degli upvotes e del tuo commento sembra essere la soluzione migliore. –