Seite 1 von 1
[Django] Middleware
Verfasst: Montag 21. Dezember 2009, 08:45
von BerlinerMC
Hallo Community,
ich wollte mal fragen ob es möglich ist, eine Middleware nur einmal, bevor die view angezeigt wird, auszuführen?!
Leider ist es immoment so, dass bei jedem request die Middleware ausgeführt wird z.B. beim Laden der CSS Datei , Bilder usw.
Lg
Alex / Berliner
Re: [Django] Middleware
Verfasst: Montag 21. Dezember 2009, 09:15
von /me
BerlinerMC hat geschrieben:
ich wollte mal fragen ob es möglich ist, eine Middleware nur einmal, bevor die view angezeigt wird, auszuführen?!
Was verstehst du unter hier unter Middleware? Meinst du das Parsen der URL, die Zuordnung zu einer View und die Verarbeitung dort? So lange du nicht explizit selber eine weitere Verarbeitung aufrufst findet auch keine statt.
BerlinerMC hat geschrieben:
Leider ist es immoment so, dass bei jedem request die Middleware ausgeführt wird z.B. beim Laden der CSS Datei , Bilder usw.
Wenn es dir um statische Dateien geht, dann schau dir mal
http://docs.djangoproject.com/en/dev/ho ... tic-files/ an.
Verfasst: Montag 21. Dezember 2009, 10:16
von BerlinerMC
Naja ich möchte das eine Funktion aufgerufen wird, bevor die Seite angezeigt wird. Ich hatte gehofft das ich es mit Middleware lösen könnte.
Jedoch besteht hier das Problem das die Funktion mehrmal, bei jedem request, aufgerufen wird!
Gibt es andere Möglichkeiten Funktionen aufzurufen, irgendwo an einer Zentralen Stelle?!
Verfasst: Montag 21. Dezember 2009, 11:11
von Defnull
Was willst du denn eigentlich tun?
Verfasst: Montag 21. Dezember 2009, 12:38
von apollo13
BerlinerMC hat geschrieben:Naja ich möchte das eine Funktion aufgerufen wird, bevor die Seite angezeigt wird. Ich hatte gehofft das ich es mit Middleware lösen könnte.
Dafür sind middlewares da…
Jedoch besteht hier das Problem das die Funktion mehrmal, bei jedem request, aufgerufen wird!
Nein pro request wird eine Django middleware definitiv nur einmal aufgerufen!
Verfasst: Montag 21. Dezember 2009, 12:39
von BerlinerMC
BerlinerMC hat geschrieben:Naja ich möchte das eine Funktion aufgerufen wird, bevor die Seite angezeigt wird. Ich hatte gehofft das ich es mit Middleware lösen könnte.
Also z.B. eine Funktion die Zählt wie oft ein User Seiten aufruft.
Also ein User loggt sich ein und klickt nun auf meiner Homepage rum. Im Hintergrund gibt es einen Zähler und speichert das gezählte ggf. in die DB ein und ich kann im Nachhinein nachvollziehen wie viel Seiten er aufgerufen hat.
Ist nun ein bisschen trivial und man fragt sich bestimmt wozu ich das benötige! Eine derartige Funktion benötige ich auch nicht, aber so ungefähr.
Aber eine derartige Funktion nun in jeder "View" einzufügen wäre ein bisschen umständlich?!
Daher hoffte ich das ich sowas mit Middleware zentral lösen könnte.
Verfasst: Montag 21. Dezember 2009, 16:51
von apollo13
Dann zähl in der Middleware doch einfach mit, wo ist das Problem? Die Middleware wird wie gesagt nur einmal pro request ausgeführt, also genau das was du willst…
Verfasst: Montag 21. Dezember 2009, 16:57
von lunar
"Eine Seite" ist nicht gleichbedeutend mit "einem Request".
Verfasst: Montag 21. Dezember 2009, 17:10
von apollo13
lunar hat geschrieben:"Eine Seite" ist nicht gleichbedeutend mit "einem Request".
Doch, er kann ja mit request.is_ajax die Ajax Requests ausschließen, die übrigen entsprechen dann den Views…
Verfasst: Montag 21. Dezember 2009, 17:19
von lunar
So? Was ist beispielsweise mit Bildern, die dynamisch erzeugt werden (e.g. capchas)?
Verfasst: Montag 21. Dezember 2009, 17:24
von /me
lunar hat geschrieben:So? Was ist beispielsweise mit Bildern, die dynamisch erzeugt werden (e.g. capchas)?
Für deren Requests baut man eine Negativliste in der Middleware um sie nicht mitzuzählen.
Verfasst: Montag 21. Dezember 2009, 17:41
von apollo13
lunar hat geschrieben:So? Was ist beispielsweise mit Bildern, die dynamisch erzeugt werden (e.g. capchas)?
Nun du kannst jetzt noch mit 100 Beispielen kommen und ich werde dir immer sagen, was du tun musst damit eine Middleware dennoch passt, also lassen wir das :þ Abgesehen davon könnte man natürlich decorators auch verwenden, wird allerdings unlustig jeden View zu dekorieren…