Globale Variablenverwendung mit web.py in Apache

Ich habe ein seltsames Problem gefunden, als ich meinen Web.py Code mit Apache konfiguriert habe. Ich habe 3 Variable, die ich über 2 Klassen verwenden muss. Ich habe das mit globalen Variablen verarbeitet, aber leider funktioniert das jetzt nicht.

Beispiel:

urls = ( '/', 'index', '/result','Result' ) # index is basically a form which takes some inputs class index: def POST(self): global VAR1, VAR2, VAR3 i = web.input() VAR1 = i.word1.__str__() VAR2 = i.word2.__str__() VAR3 = i.word3.__str__() raise web.seeother('/result') class Result: def GET(self): print VAR1, VAR2 return r_result(VAR1, VAR2) def POST(self): print VAR2, VAR3 

Das funktioniert ganz gut, wenn ich den Code selbständig ausführe (dh python webappy.py), aber wenn er in den apache-Einstellungen verwendet wird, gibt es:

NameError: Der globale Name 'VAR1' ist in der print-Anweisung in Result.Get nicht definiert

Ich habe die ApplicationIssues: http://code.google.com/p/modwsgi/wiki/ApplicationIssues überprüft und die folgende Aussage gefunden.

Anwendung Globale Variablen

Da der Python-Sub-Interpreter, der eine WSGI-Applikation hostet, im Speicher zwischen Anfragen beibehalten wird, sind alle globalen Daten effektiv persistent und können verwendet werden, um den Status von einer Anfrage zur nächsten weiterzuleiten. Auf UNIX-Systemen jedoch wird Apache normalerweise mehrere Prozesse verwenden, um Anfragen zu behandeln, und jeder dieser Prozess hat seine eigenen globalen Daten. Dies bedeutet, dass, obwohl globale Daten verwendet werden können, es nur zum Cache von Daten verwendet werden kann, die im Rahmen dieses einzelnen Prozesses sicher wiederverwendet werden können. Sie können keine globalen Daten als Mittel zum Halten von Informationen verwenden, die für jeden Anforderungshandler sichtbar sein müssen, unabhängig davon, in welchem ​​Prozess es läuft.

Ich muss diese Variablen über die Klassen und Funktionen übergeben. Ich versuchte, die Variablen an builtin & Web-Modul anzubringen, aber es hat auch kein Training gemacht.

PS: Auch ich möchte diese Variablen nicht in Dateien oder db speichern.

Ich hoffe, ich habe mich klar gemacht.

2 Solutions collect form web for “Globale Variablenverwendung mit web.py in Apache”

Bei der Entwicklung von Webanwendungen sollten Sie sich nicht auf globale Variablen verlassen, da es irgendwann so konfiguriert werden kann, dass es in separaten Prozessen ausgeführt wird, die diese Variablen nicht teilen.

Um sie zwischen Anfragen zu halten, solltest du sie speichern und aus dem persistenten Speicher laden, also schätze ich es nicht ohne Datenbank oder ähnliche Lösung.

Ein guter Weg, um zu laden und zu speichern, wäre durch die Verwendung von Anwendungsprozessoren , die diese Variablen in web.ctx laden, so dass Sie sie in Controller-Methoden zugreifen können.

Beispielsweise:

 def global_variables_processor(handle): # load variables from persistent storage and save them in web.ctx.global_variables try: return handle() finally: # save variables from web.ctx.global_variables in persistent storage app = web.application(urls, globals() app.add_processor(global_variables_processor) 

Nun, es gibt einen möglichen Grund in diesem Auszug aus deiner Frage …

Apache wird normalerweise mehrere Prozesse verwenden, um Anfragen zu behandeln, und jeder dieser Prozess hat seine eigenen globalen Daten.

… so wird Ihr Code nur zuverlässig funktionieren, wenn Sie Apache konfiguriert haben, um einen einzigen Prozess zu verwenden, der niemals endet, mit den Anweisungen …

 MaxClients 1 MaxRequestsPerChild 0 

Wenn dies keine praktische Option ist, müssen Sie diese Variablen irgendwo anders speichern.

  • Python 2.7 mit Webpy - flup oder modwsgi?
  • Melden Sie sich eingehende IP-Adressen in web.py an
  • Beenden eines uwsgi-Arbeiters programmgesteuert
  • Ändern des statischen Verzeichnispfads in webpy
  • Session in webpy - Benutzernamen in allen Klassen
  • Mit web.py als nicht blockierenden http-Server
  • Warum bekomme ich einen KeyError?
  • Web-App startet viele Male - web.py
  • Rendering von Zeilenumbrüchen in vom Benutzer übermittelten Inhalt (Python Web App)
  • Wie kann man die Sitzungsdaten im automatisierten Test initialisieren? (Python 2.7, webpy, nosetests)
  • Web.py: Wie bekomme ich POST-Parameter und GET-Parameter?
  • Python ist die beste Programmiersprache der Welt.