Django Templates und Cache

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Ich weiß zwar nicht, ob das deinen Anforderungen genügt, aber du weißt schon, dass django bereits ziemlich gute Caching-Funktionen hat?
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Ja, weiß ich, aber was soll der Hinweis? Ich verwende ja eben genau diese Caching Funktion, die Django bereit stellt...
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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...
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten