Django - Middleware kommunizieren mit Ansichten / Vorlagen

7

Okay, das ist wahrscheinlich eine wirklich alberne Frage, aber ich bin neu bei Python / Django, also kann ich meinen Kopf noch nicht wirklich in die Scoping-Konzepte einwickeln. Im Moment schreibe ich eine Middleware Klasse, um einige Dinge zu erledigen, und ich möchte 'globale' Variablen festlegen, auf die meine Ansichten und Vorlagen zugreifen können. Was ist der "richtige" Weg, dies zu tun? Ich dachte darüber nach, so etwas zu tun:

middleware.py

%Vor%

ansichten.py

%Vor%

Obwohl das funktioniert, bin ich mir nicht sicher, ob es der "Django-Weg" oder der "Python-Weg" ist, dies zu tun.

Meine Fragen sind also:
1. Ist das der richtige Weg? 2. Wenn es der richtige Weg ist, was ist der richtige Weg, um Variablen, die in der tatsächlichen Vorlage verwendet werden können, aus der Middleware hinzuzufügen? Angenommen, ich möchte etwas auswerten und in der Middleware eine Variable headername als 'Name meiner Site' festlegen und% code% in allen Vorlagen verwenden. Wenn ich es so mache, wie ich es jetzt habe, müsste ich {{ headername }} zum Kontext in jeder Ansicht hinzufügen. Gibt es das überhaupt, um das zu umgehen? Ich denke etwas in der Art von CakePHP headername
3. Ich benutze die Middleware-Klasse als ein Äquivalent von CakePHPs $this->set('headername','My Site Name'); , die ausgeführt wird, bevor jede Ansicht (oder Controller in CakePHP) aufgerufen wird. Ist das der richtige Weg? 4. Völlig unabhängig, aber es ist eine kleine Frage, was ist eine nette Möglichkeit, den Inhalt einer Variablen in den Browser ala beforeFilter auszudrucken? Angenommen, ich möchte alle Inhalte in print_r sehen, die in die Ansicht übernommen wurden? Ist request die Antwort?

    
Paolo Bergantino 17.02.2009, 15:47
quelle

3 Antworten

19
  1. Es ist nicht der beste Weg. Sie könnten my_var auf die Anfrage und nicht auf die Einstellungen setzen. Einstellungen sind global und gelten für die gesamte Site. Sie möchten es nicht für jede Anfrage ändern. Es könnte Probleme mit dem gleichzeitigen Zugriff geben, wenn mehrere Requests die Variable gleichzeitig aktualisieren / lesen.

  2. Um auf request.my_var in Ihren Vorlagen zuzugreifen, können Sie {{request.my_var}} verwenden. Um Zugriff auf die Anfragevariable in Ihrer Vorlage zu erhalten, müssen Sie django.core.context_processors.request zu Ihrer Einstellung TEMPLATE_CONTEXT_PROCESSORS hinzufügen.

  3. Ja. Eine andere Terminologie zum Beschreiben einer Anforderungs-Middleware wäre ein Anforderungs-Preprozessor / Filter / Interzeptor.

Wenn Sie einen gemeinsamen Site-Namen für die Kopfzeile in Ihren Vorlagen verwenden möchten, sollten Sie auch die Anwendung Django Sites auschecken, die eine Site-Name-Variable für Ihre Verwendung bereitstellt.

    
Akbar ibrahim 17.02.2009, 16:06
quelle
12

Folgendes machen wir. Wir verwenden einen Kontextprozessor wie diesen ...

%Vor%

Hier die Einstellung, die dies aktiviert.

%Vor%

Dies liefert "globale" Informationen im Zusammenhang mit jeder Vorlage, die gerendert wird. Dies ist die Standardlösung von Django. Weitere Informationen zu Kontextprozessoren finden Sie Ссылка .

"Was ist eine nette Art, den Inhalt einer Variablen in den Browser ala print_r zu drucken?"

In der Ansicht? Sie können einer Vorlage, die für Debugzwecke gerendert werden soll, eine pprint.pformat -Zeichenfolge bereitstellen.

Im Protokoll? Sie müssen Pythons logging -Modul verwenden und Zeug in eine separate Protokolldatei senden. Die Verwendung einfacher print-Anweisungen zum Schreiben von Daten in das Protokoll funktioniert bei allen Django-Implementierungen nicht wunderbar konsistent (mod_python beispielsweise verliert alle stdout- und stderr-Komponenten.)

    
S.Lott 17.02.2009 16:06
quelle
4

1) Wenn Sie "Einstellungen" ändern, wird dies auch bei Anfragen wirklich global sein. Mit anderen Worten, gleichzeitige Anforderungen werden sich gegenseitig stampfen, wenn Sie für jede Anforderung einen eigenen Wert benötigen. Es ist sicherer, das Anforderungsobjekt selbst zu modifizieren, was einige der gebräuchlichen Django-Middleware tun (z. B. django.contrib.auth.middleware.AuthenticationMiddleware fügt einen Verweis auf 'user' auf dem Anforderungsobjekt hinzu)

2) (BEARBEITEN 2) Siehe # 4, ein gemeinsamer Satz von Variablen in jeder Vorlage ist wahrscheinlich besser für einen benutzerdefinierten Kontextprozessor geeignet.

3) Ich kenne mich mit CakePHP nicht aus, aber das Hinzufügen einer process_request-Middleware ist definitiv eine gute Django-Methode zur Vorverarbeitung jeder Anfrage.

4) Sehen Sie sich das Dokument für Vorlagenkontext-Prozessoren an . Wenn Sie RequestContext verwenden, enthält jede Vorlage eine Kontextvariable namens "request", die Sie in Ihrer Vorlage ablegen können. Sie können auch den Debug-Kontext-Prozessor verwenden und so etwas tun, so dass es nur bei den Einstellungen dumps.DEBUG = True:

%Vor%

Dies wird sowohl für GET als auch für POST funktionieren, aber Sie können entsprechend ändern, wenn Sie nur das eine oder das andere brauchen.

BEARBEITEN

Außerdem habe ich mir Ihre views.py genauer angesehen. Ich bin mir nicht sicher, ob ich vollständig verstehe, was Sie dort versuchen, indem Sie einfach die Variable in der Antwort zurückgeben. Wenn Sie wirklich diesen Anwendungsfall haben, werden Sie wahrscheinlich auch den Mimetyp wie folgt einstellen wollen:

%Vor%

Das ist nur explizit, dass Sie nicht HTML, XML oder einen anderen strukturierten Inhaltstyp zurückgeben.

BEARBEITEN 2

Gerade sah die Frage wurde mit einer neuen Teilfrage, umnummerierte Antworten

aktualisiert     
Joe Holloway 17.02.2009 16:02
quelle

Tags und Links