2010-10-26 8 views
12

Ich las über die doc Flask - und stieß auf this:Kontext Lokale - wie machen sie lokale Kontextvariablen global?

... Für Web-Anwendungen ist es zu auf die Daten an den Server gesendet einen Client reagieren entscheidend ist. In Flask ist diese Information , die von dem globalen Anforderungsobjekt bereitgestellt wird. Wenn Sie etwas Erfahrung mit Python haben, fragen Sie sich vielleicht, wie das Objekt global sein kann und wie Flask schafft, immer noch threadsicher zu sein. Die Antwort sind kontext Einheimischen ...

Jetzt verstand ich Zusammenhang Einheimische Sachen wie die with Aussage zu sein (sicherlich das ist, was die python 2.6 doc zu vorschlagen scheint). Ich bemühe mich zu sehen, wie Sie dadurch global zugängliche vars in einem lokalen Namespace erhalten könnten. Wie funktioniert das konzeptionell?

Auch: Globals gelten im Allgemeinen als dreckig ich nehme es, also warum ist das OK?

+3

Es ist in Ordnung, weil das Gestrüpp der Globals nach unten sehr gründlich tun können. – aaronasterling

Antwort

4

Sie sind eigentlich Proxy-Objekte für die echten Objekte, so dass Sie beim Zugriff auf ein Objekt Zugriff auf das Objekt für Ihren aktuellen Thread erhalten.

Ein Beispiel wäre das Objekt request. Sie können sehen, dass dies in globlals.py eingerichtet und dann in die __init__.py für Kolben importiert wird.

Der Vorteil davon ist, dass Sie die Anfrage nur zugreifen, indem

from flask import request 

tun und schreiben Methoden wie

@app.route('/') 
def hello_world(): 
    return "Hello World!" 

, ohne die Anfrage um als Parameter zu übergeben.

Dies verwendet einige der wiederverwendbaren Code-Bibliotheken von Werkzeug.

+0

Tut mir leid, wenn ich dicht bin: aber wenn ich das richtig bekomme, schieben sie den Kontext auf eine Art 'Stackframe' und können dann den Attributsaufruf entsprechend dem richtigen verknüpften Objekt basierend auf diesem Stack leiten. – Malang

+1

Wenn Sie eine Kopie der [Quelle für Werkzeug] (http://pypi.python.org/packages/source/W/Werkzeug/Werkzeug-0.6.2.tar.gz) suchen und in 'local.py' suchen Sie werden sehen, dass die 'Local'-Klasse grundsätzlich ein Wörterbuch mit der aktuellen Thread-ID als Schlüssel verwendet, um die richtigen Objekte transparent zu speichern und abzurufen. Dies ist die Grenze dessen, was ich ableiten kann, ohne einige Tests einzurichten, um herauszufinden, was der Code tut. – mikej

+0

Ich denke nicht, dass ein Stack für das oben genannte notwendig ist. Dies ist nur eine Vermutung, aber der Stapel fügt möglicherweise nur eine zusätzliche Ebene zu diesem Kommentar in der Dokumentation hinzu, mit der Sie verbunden sind: * Auf intelligente Weise kann eine Anwendung eine andere Anwendung aufrufen, ohne zu brechen. * – mikej

-2

Namensräume in Python sind im Grunde Wörterbücher Sie

globals()['foo']=bar
+0

+1 guter Punkt:) – Malang

+0

Warum wird dies abgelehnt? Ich wünsche, dass S/O-Unterwähler eine Erklärung abgeben. Es könnte ein gutes Lernen sein. Ich könnte etwas verpasst haben, aber wenn ich die Thread-ID für 'foo' verwende, sieht es wie eine perfekte globale Variable pro Thread aus, die im Wesentlichen die gleiche Idee wie die akzeptierte Antwort ist.Python-integriertes 'dict' ist Thread-sicher. –

Verwandte Themen