Seite 1 von 1

Django Templates und Cache

Verfasst: Dienstag 5. Mai 2009, 16:58
von nemomuk
Hallo,

ich versuche gerade per Django ein Cache-System zu bauen und stehe da vor einem Problem.

Code: Alles auswählen

{% cache 500 name %}
{% for object in objects %}
	<tr>
		<td>{{ object.xy }}</td>
		<td>{{ bject.xy }}€</td>
		<td></td>
	</tr>
{% endfor %}
{% endcache %}
Bei "objects" handelt es sich um Daten aus der Datenbank. In der View-Funktion müsste ich ja jetzt die Objekte aus der Datenbank holen, da das ja leider nicht funktioniert in Django Templates (Jinja kann das...). Wie soll ich jetzt in der View-Funktion wissen, ob ich die Daten aus der Datenbank holen muss oder nicht bzw. ob das Cache-Limit aus dem Template bereits abgelaufen ist? Mit Jinja könnte ich ja direkt die Daten im Cache-Teil holen und die würden ja nur geholt, wenn benötigt.

Danke!

Verfasst: Dienstag 5. Mai 2009, 17:03
von Dauerbaustelle
Ich weiß zwar nicht, ob das deinen Anforderungen genügt, aber du weißt schon, dass django bereits ziemlich gute Caching-Funktionen hat?

Verfasst: Dienstag 5. Mai 2009, 18:29
von nemomuk
Ja, weiß ich, aber was soll der Hinweis? Ich verwende ja eben genau diese Caching Funktion, die Django bereit stellt...

Verfasst: Dienstag 5. Mai 2009, 18:51
von Dauerbaustelle
Ooohh, ich hatte den Code jetzt garnicht gelesen, ich sah nur " per Django ein Cache-System zu bauen". Pardon ;-)

Zum Thema:
Weiß das template, dass es gerade (nicht) aus dem Cache holt? Wenn ja, kannst du das auch ja übergeben... D.h. du baust dir einen Wrapper für die Objekte...

Verfasst: Dienstag 5. Mai 2009, 22:02
von sma
SchneiderWeisse, ich glaube, du unterliegst einem Denkfehler. Django cacht Seitenfragmente, keine Datenbank-Objekte. Dem Cache-Rahmenwerk ist es egal, wie die Seite entstand, solange ihr Zeit noch nicht abgelaufen ist, wird sie einfach benutzt und das in {% cache %} und {% endcache %} eingeschlosse Stück Programm wird überhaupt nicht ausgeführt.

Zweitens baust du in der Regel im View nur QuerySets zusammen, fragst jedoch noch keine Daten von der DB ab. Das passiert erst, wenn du das erste Mal auf das QuerySet zugreifst.

Ist dein View komplizierter und du brauchst viele explizite DB-Anfrage, dann bist du an die Grenzen des einfachen Cachings von Django-Views gekommen und musst selbst etwas mit den low-level-API-Funktionen bauen.

Stefan