"Lazy Load" von Daten aus einem Kontextprozessor

8

In jeder Ansicht meiner Anwendung muss das Navigationsmenü vorbereitet sein. So mache ich jetzt in jeder Ansicht eine komplizierte Abfrage und speichere das Menü in einem Wörterbuch, das an eine Vorlage übergeben wird. In Templates ist die Variable, in der ich die Daten habe, mit "Cache" umgeben, so dass die Abfragen zwar ziemlich teuer sind, mich aber nicht stören.

Aber ich möchte mich nicht in jeder Hinsicht wiederholen. Ich vermutete, dass der beste Ort, um das Menü vorzubereiten, in meinem eigenen Kontextprozessor ist. Und so habe ich einen geschrieben, aber mir ist aufgefallen, dass selbst wenn ich die Daten des Kontextprozessors nicht verwende, die Abfragen ausgeführt werden, die zur Vorbereitung des Menüs verwendet werden. Gibt es eine Möglichkeit, solche Daten vom CP "lazy load" zu laden oder muss ich den "low level" -Cache in CP verwenden? Oder gibt es eine bessere Lösung für mein Problem?

    
szymond 19.12.2011, 15:51
quelle

2 Antworten

18

Django hat eine SimpleLazyObject . In Django 1.3 wird dies vom Auth-Kontext verwendet Prozessor ( Quellcode ) ). Dies macht user im Vorlagenkontext für jede Abfrage verfügbar, aber auf den Benutzer wird nur zugegriffen, wenn die Vorlage {{ user }} enthält.

Sie sollten etwas Ähnliches in Ihrem Kontextprozessor machen können.

%Vor%     
Alasdair 19.12.2011, 17:02
quelle
3

Wenn Sie ein aufrufbares Objekt in den Vorlagenkontext übergeben, wird es von Django ausgewertet, wenn es in der Vorlage verwendet wird. Dies bietet eine einfache Möglichkeit, Faulheit zu tun - geben Sie einfach Callables:

%Vor%

Das Problem dabei ist, dass der Aufruf nicht protokolliert wird - wenn Sie ihn mehrmals verwenden, wird complicated_query mehrmals aufgerufen.

Das Problem besteht darin, etwas wie SimpleLazyObject wie in der anderen Antwort zu verwenden oder etwas wie diesen Memoize Decorator zu verwenden:

%Vor%

Oder, wenn die Funktion bereits existiert, würden Sie es so machen:

%Vor%

Ich würde diese Methode gegenüber SimpleLazyObject bevorzugen, weil letztere einige seltsame Fehler erzeugen kann manchmal .

(Ich war derjenige, der ursprünglich LazyObject und SimpleLazyObject implementiert hat und für mich selbst entdeckt hat, dass es auf jedem Codeartefakt, Einfach .)

    
spookylukey 26.01.2015 07:53
quelle