2012-04-13 15 views
5

Ich verwende Django Compressor, um meine Kaffee/weniger Dateien zu verwalten, und es ist großartig für die Entwicklung, aber ich hatte einige Probleme, damit es für meine Produktionsbereitstellung funktioniert.Wie benutzt man den Django-Kompressor mit Apache?

Meine Idee ist Apache, um die statischen Dateien möglicherweise in einem anderen Server hosten. Ich setze COMPRESS_OFFLINE = True auf die Datei .

Dann mache ich die folgenden

  • python manage.py compress - Dieses füllt das CACHE Verzeichnis in meinem static Verzeichnis, in dem alle statischen Dateien gesammelt werden.
  • - Dies sammelt statische Dateien von allen Anwendungen in meinem Projekt (von denen einige keinen Kompressor verwenden) in meinem Verzeichnis static.
  • Kopieren Sie das Verzeichnis static irgendwo mit Apache gehostet werden. Und richten Sie Apache ein, um die Dateien zu bedienen.
  • Ändern Sie die static_url Variable in der Datei, um auf den statischen Server zu verweisen.

Wenn ich eine Seite zu öffnen, ich folgende Fehlermeldung auf meinem Server zu bekommen, scheint dies nur zu geschehen, wenn ich DEBUG = False und COMPRESS_OFFLINE = True auf meine settings.py Datei:

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

Wenn ich überprüfen Sie die static/CACHE Verzeichnis bestätige ich, was der Fehler sagt, das ist meine manifest.json Datei:

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

Wenn ich das Cache-Verzeichnis löschen und erneut ausführen 012.343., ich erhalte einen neuen Satz von IDs sowohl für die Fehlermeldung als auch für die Manifestdatei, aber die ID des Fehlers fehlt noch im Manifest.

Also, ich denke, es gibt zwei Fragen hier. Warum funktioniert es nicht? Was ist der richtige Weg, um dies zu erreichen?

Danke.

+0

Haben Sie Kompressor-Finder in 'STATICFILES_FINDERS' in den Einstellungen? – ilvar

+0

Bitte zeigen Sie Ihren Template-Code an, wo Sie das '{% compress%}' - Tag verwenden, das beim Debuggen des 'TemplateSyntaxError' helfen würde :) – vdboor

Antwort

15

Wenn Sie Kompresse ausgeführt haben, und Sie erhalten nach wie vor die Nachricht

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

dann ist es wahrscheinlich, dass Sie dynamische Inhalte haben innen komprimieren Tags. Stellen Sie sicher, dass die Komprimierung immer der innerste Block ist und dass sich innerhalb des Komprimierungsblocks keine Tags befinden.

+1

Für zukünftige Leute von Google: dynamische Inhalte innerhalb von compress-Tags (zum Beispiel' {% compress css %} {% if bootstrap%} ') kann den OfflineGenerationError auf alle Arten von seltsamen Arten verursachen - einschließlich nur für einige Benutzer Ihrer Site, obwohl sie die gleichen Vorlagen erhalten sollten! Ich habe diese Antwort zunächst ignoriert, weil meine Situation nur für einige Benutzer galt, aber das war auf eigene Gefahr. Das war die Antwort. – kqr

3

Ich nehme an, dass Sie django-compressor 1.1.2 verwenden, das das statische Template-Tag {% static "..."%} nicht unterstützt.

Versuchen Sie, die Entwickler-Version von django-Kompressor Installation mit:

pip install django_compressor==dev

Es soll das Problem lösen.

0

David Wolfe absolut richtig ist: hatte den gesamten Code von mir zu graben Throught loszuwerden {% trans ... etc. ich es so machen:

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

Hoffnung, hilft jemand!

+0

Danke, ich habe Davids Antwort als akzeptiert markiert. Ich habe es nicht getestet (ich habe seit Jahren nicht daran gearbeitet), aber basierend auf den Upvotes und Ihrem Kommentar scheint es die gute Lösung zu sein. –