2017-06-14 5 views
0

Ich entwickle eine Webapp mit Google App Engine und Python. Ich stehe vor einem seltsamen Problem und ich weiß nicht, wie ich es lösen soll und was es verursacht. Wenn ich ein Formular ausfülle, sende ich die Daten für die Überprüfung. Wenn sie nicht vollständig sind und einige Felder fehlen, sendet der Server das Formular mit dem Hinweis "ALLE FELDER FÜLLEN!" Zurück.python self.session speichert Daten nicht korrekt

Das ist ziemlich gut funktionieren.

Was ich versuche ist, das Formular mit den Feldern "description" und "title" zurückzusenden, gefüllt mit dem, was der Benutzer geschrieben hat, bevor er das Formular abschickt, also muss er nur die nicht gefüllten Felder ausfüllen (und er muss nicht alles von Anfang an neu schreiben).

, dass der Code ist:

class SaleAnnCheck(BaseHandler): 
    def post(self): 
    title = self.request.POST.get('title') 
    cat = self.request.POST.get('cat') 
    description = self.request.POST.get('description') 
    AcqOpt = self.request.POST.get('AcqOpt') 
    lat = self.request.POST.get('lat') 
    lng = self.request.POST.get('lng') 
    image1 = self.request.POST.get("file1", None) 
    image2 = self.request.POST.get("file2", None) 
    image3 = self.request.POST.get("file3", None) 
    logging.info("info sale announcment") 
    logging.info(title) 
    logging.info(cat) 
    logging.info(description) 
    logging.info(AcqOpt) 
    logging.info(lat) 
    logging.info(lng) 
    logging.info(image1) 
    logging.info(image2) 
    logging.info(image3) 
    self.session["ECommerceUser"]["description"]=description 
    self.session["ECommerceUser"]["title"]=title 
    logging.info('session') 
    logging.info(self.session["ECommerceUser"]) 
    if title == '' or cat == None or description == '' or AcqOpt == None or lat == '' or lng == '': 
     error = 'empty' 
     urlR='/CreateSaleAnn?'+urllib.urlencode({'error':'empty'}) 
     self.redirect(urlR) 


class Create(BaseHandler): 
    def get(self): 
    error = self.request.get('error') 
    if error == 'empty': 
     logging.info('sbagliato') 
     logging.info(self.session["ECommerceUser"]) 
     template = JINJA_ENVIRONMENT.get_template('templates/CreateAnnouncement.html') 
     w = self.response.write 
     w(template.render({'error':'FILL ALL THE MANDATORY FIELDS!', 'description': self.session["ECommerceUser"]["description"], 'title': self.session["ECommerceUser"]["title"]})) 
    else: 
     logging.info('giusto')  
     logging.info(self.session["ECommerceUser"]) 
     template = JINJA_ENVIRONMENT.get_template('templates/CreateAnnouncement.html') 
     w = self.response.write 
     w(template.render({'description': self.session["ECommerceUser"]["description"], 'title': self.session["ECommerceUser"]["title"]})) 

Wenn ich das Formular des Inhalt, indem sie eine HTTP-Post-Anforderung zu einer bestimmten URL, behandelt von SaleAnnCheck geprüft.

Beschreibung und Titel werden in der Sitzung korrekt gespeichert (ich habe es überprüft, indem ich den Inhalt von self.session ["ECommerceUser"] in den Protokollen gedruckt habe). Wenn ein Feld nicht ausgefüllt ist, wird der Server erneut auf die Formularseite umgeleitet, indem eine GET-Anforderung an eine verwandte URL gesendet wird.

Die Anfragen an diese URL werden von Create bearbeitet. Aber wenn ich versuche, die HTML-Vorlage des Formulars (mit jinja2) mit den vorherigen typisierten Werten von Beschreibung und Titel zu rendern, werden die zugehörigen Textbereiche nicht mit diesen Werten gefüllt. Es passiert, weil self.session ["ECommerceUser"] ["description"] und self.session ["ECommerceUser"] ["title"] leer sind, aber sie waren nicht, als ich sie vorher überprüft habe (in SaleAnnCheck).

Warum passiert es? Irgendeine Erklärung? Es ist ein seltsames Problem und es gibt keine Tipps oder Vorschläge über das Internet

+0

Sie sind Variablen wie Sitzungen zu speichern, die Seite umzuleiten, dann die Sitzung für eine andere Abrufen Funktion. Dies ist nicht die beste Architektur, um Variablen einfach zu übergeben. Versuchen Sie, nach Python HTTP Requests und Promises zu suchen. –

Antwort

0

Dies ist, weil "self.session" keine Sitzung ist, es ist nur eine Klassenvariable und nicht außerhalb der Klasse lesbar. Wenn Sie wirklich permanenten Sitzungen zum Speichern von Variablen verwenden möchten, versuchen, etwas wie folgt aus:

Aus der Dokumentation: http://docs.python-requests.org/en/master/user/advanced/

s = requests.Session() 

s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') 
r = s.get('http://httpbin.org/cookies') 
+0

Ich habe seit jetzt Sitzung in der Art verwendet, die in dieser Dokumentation beschrieben wird: http://webapp2.readthedocs.io/en/latest/api/webapp2_extras/sessions.html. Ich hatte kein Problem außer dem. Wenn ich die Anmeldung mache, speichert die App die Informationen über den Login innerhalb der Sitzung (genauso wie ich es für SaleAnnCheck getan habe) und es funktioniert. Ich kann alle Infos zum Login überall lesen. Das Login wird von einer anderen Klasse in einem anderen Python-Modul behandelt. Warum funktioniert es? –