2016-03-25 9 views
0

Ich habe Python-Skript in meiner webapp2 Anwendung in Google App Engine:globaler Variable, die nur für die Lebensdauer des Antrags beharrten - Python, webapp2

x = 0 

class MyHandler(webapp2.RequestHandler): 

     def get(self): 

      global x 
      x = x + 1 
      print x 

Mit jeder Aktualisierung der Seite (oder neue Benutzer verbinden) , die Zählung erhöht sich. Python startet bei jeder Anfrage keinen neuen Prozess (aber ich habe es erwartet). Wie könnte ich mit Szenarien umgehen, in denen ich eine globale Variable haben möchte, die nur für die Lebensdauer der Anfrage bestehen bleibt? Kann ich eine Instanzvariable verwenden und wie genau?

Antwort

1

Das Verhalten Ihres Sehens erwartet. Neue Instanzen werden nicht für jede Anfrage gestartet.

Verwenden Sie das Request-Objekt, env Objekt oder einen Thread lokalen Variable zum Speichern von Informationen, die Sie zugänglich, wo jeder in Ihrem Code für das Leben des Antrags haben wollen. (Environ wird in jeder Anfrage neu erstellt, also ist es sicher).

Siehe Is threading.local() a safe way to store variables for a single request in Google AppEngine? für eine Diskussion über Thread-Lokalspeicher verwenden. Hier

ist ein Beispiel für das lokale Anforderungsobjekt speichern spezifische Informationen für das Leben einer Anfrage zu speichern. Der gesamte Code muss sich in Ihrem Handler befinden. Alle Teile sind in webapp2 dokumentiert. Übrigens verwende ich webapp2 nicht, also wird dies nicht getestet. (Ich benutze Pyramide/Bobo und dieses Modell zum Durchführen von Caching auf Anforderungsebene).

Klasse MyHandler (webapp2.RequestHandler):

def get(self): 
     req = webapp2.get_request() 
     # you have request in self, however this is to show how you get a 
     # request object anywhere in your code. 


     key = "Some Key" 

     if req: 
      # getting some store value from the environ of request (See WebOb docs) 
      someval = req.environ.get(key,None) 
      if someval : 
       # do something 

     # and setting 
     if req: 
      req.environ[key] = 'some value' 

es auf diese Weise tun gibt es die Einschränkung, dass environ [ 'key'] Wert muss ein String sein.

die WebOb Dokumente lesen, wie im Request-Objekt beliebige Werte zu speichern. http://docs.webob.org/en/stable/reference.html#ad-hoc-attributes -

req.environ['webob.adhoc_attrs'] 
{'some_attr': 'blah blah blah'} 

Auch wenn Sie eine Lese des webapp2 Request-Objekt docs haben, gibt es eine Registrierung, die Sie zum Speichern von Informationen verwenden können - http://webapp-improved.appspot.com/api/webapp2.html#webapp2.Request

Hinweis, jede Variable, die Sie außerhalb eines Request-Handler definieren im Wesentlichen zwischengespeichert, verfügbar für die Lebensdauer der Instanzen. Dies ist, wo Sie falsch liegen.

Um zu verstehen, wie/warum Caching App-Ebene funktioniert - und warum Ihr erster Versuch nicht tut, was man einen Blick auf https://cloud.google.com/appengine/docs/python/requests#Python_App_caching

+0

Leider haben Sie mit dem Code helfen mir haben? Ich bin neu bei Python ... – Dennix