Django: rendert Staticfiles über die Template-Engine zum Zeitpunkt der Bereitstellung

8

Ich möchte einige statische Dateien (insbesondere * .js) mit Django-Template-Variablen rendern. Ich glaube, das ist ein häufiger Anwendungsfall, besonders wenn man irgendwas AJAX-y macht; Ich möchte AJAX-URLs in meinen .js-Dateien nicht mehr fest codieren, als ich sie in meinen .html-Dateien fest codieren möchte. Aber natürlich möchte ich nicht, dass diese statischen Dateien bei jeder Client-Anfrage durch die Template-Engine laufen müssen, weil das langsam ist. Ich beziehe mich auf Dinge wie URLs (die sich nach dem Kompilieren / Deployen nicht ändern) oder statische (nicht-db) Modellattribute. (Ich nehme an, es gibt Anwendungsfälle, in denen diese Dinge zur Laufzeit geändert werden könnten - das ist schließlich Python - aber ich denke, dass sie ungewöhnlich sind). Für einige mögliche Template-Variablen (z. B. Modellfelder) muss die Datei natürlich zum Zeitpunkt der Client-Anfrage gerendert werden, aber das ist nicht, worüber ich spreche.

Wäre es also nicht sinnvoll, einige meiner statischen Dateien über die Template-Engine für eine Teilmenge möglicher Template-Variablen zu rendern, vielleicht gleichzeitig mit collectstatic ?

Soweit ich das beurteilen kann, ist dies zur Zeit nicht der Fall. Um klar zu sein, suche ich nach einer Lösung für statische Dateien über die Template-Engine zum Zeitpunkt der Kompilierung / Bereitstellung zu rendern, so dass es sich bei "Client-Anfrage-Zeit" tatsächlich um alte statische Dateien handelt >.

Ein solcher Ansatz würde diese Hacks vermeiden:

Haftungsausschluss:

  • Ja, ich weiß, dass es Template-Engines für Javascript gibt (Schnurrbart, Lenker, Prototyp, usw.). Warum sollte ich dem Stack eine weitere Template-Engine hinzufügen, wenn Django bereits eine hat? Plus die Syntax kollidiert! Das scheint albern.
  • Das sieht so aus, als wäre es ein Kinderspiel, aber es ist kompliziert und nicht vollständig implementiert. li>

Also:

  1. Gibt es da draußen eine Lösung, die mir fehlt?
  2. Wenn nicht, gibt es eine Möglichkeit, in collectstatic einzuhaken (wie bei einem pre-collectstatic-Hook), die es erlauben würde, bestimmte statische Dateien über die Template-Engine zu rendern, bevor sie "gesammelt" werden?

BEARBEITEN : Noch keine Antworten ... ist das eine wirklich dumme Frage, und mir fehlt etwas Offensichtliches? Wenn ja ... lass es mich wissen ...

    
andy 09.02.2014, 18:15
quelle

3 Antworten

3
  1. Es gibt mehrere Frameworks Django für denselben Zweck: django-Pipeline , django-Assets und etc., die verschiedene statische Dateien Verarbeitungsstrategien integriert, mit der Konfiguration unterschiedlicher Schwierigkeitsgrade. < br> Ich benutze ein externes Tool - Grunt (es erfordert node.js) - für die Nachbearbeitung von Assets nach collectstatic . Es ist einfacher und hat viele Plugins für jeden Zweck (Quellenvalidierung, css / js / images minification, merging, testing usw.) .

  2. Es ist möglich, collectstatic in einen benutzerdefinierten statischen Dateispeicher mit übergeordnetem post_process Methode.

Beispiel / settings.py

%Vor%

Beispiel / storage.py

%Vor%     
Evgeniy Generalov 19.03.2014 06:41
quelle
3

Eine ganz andere Art, das Problem anzugehen, wäre zu fragen, ob Sie diese URLs wirklich in Javascript bekommen müssen - kann das Javascript stattdessen die URLs von Dingen wie Datenattributen in Ihrem HTML bekommen?

Mit anderen Worten, Sie haben vielleicht gewollt:

homepage.html :

%Vor%

homepage.js :

%Vor%

Wenn es oft einfacher ist, etwas zu tun wie:

homagepage.html :

%Vor%

homepage.js :

%Vor%     
Joel Burton 19.03.2014 15:56
quelle
1

Ich denke, dass django-medusa Ihren Bedürfnissen entsprechen würde.

Wenn Sie einen Renderer einrichten und das plattenbasierte Backend verwenden, ist das Erzeugen der statischen Dateien so einfach wie:

%Vor%     
HAL 17.03.2014 22:21
quelle