So übergeben Sie komplexe Objekte über Ansichtsfunktionen / Sitzungen in Flask

8

Ich schreibe eine Webanwendung, die viele Daten von einem Drittserver empfängt, wenn (und nur wenn) ein Benutzer sich anmeldet. Diese Daten werden an benutzerdefinierte Objekte analysiert und in einem list() gespeichert. Jetzt arbeitet der Benutzer mit diesen Daten rund um die Anwendung und ruft verschiedene Ansichten auf (z. B. das Senden verschiedener Anfragen). Ich bin nicht sicher, was das beste Muster ist, um die Liste der Objekte zwischen den Ansichtsfunktionen zu übergeben?

Ich sehe technisch zwei Möglichkeiten, aber beide haben in meinem Fall Nachteile:

  1. Das Sitzungsdikt : Das Speichern der Daten in der Sitzung ist ein Overkill (die gesamte Liste wird bei jeder Anfrage zwischen Server und Browser gesendet)
  2. Persistierend : Temporäre Persistenz der Daten in einer Datenbank scheint adäquater. Aber ich hatte gehofft, überhaupt keine Datenbank benutzen zu müssen (außer für diese temporären Daten habe ich keine Daten, die lokal gespeichert werden müssen. Alles andere wird vom Server des Drittanbieters empfangen und zurückgeschickt) / li>

Ich bin kein sehr erfahrener Webentwickler, vielleicht überwache ich das Offensichtliche. Gibt es also eine andere Möglichkeit, die Daten zwischen Anfragen weiterzugeben? Vielleicht ist etwas in Flaschenmagie gebaut oder ist (in einer Datei oder Datenbank) wirklich die einzige Option?

    
cyphorious 18.09.2013, 13:04
quelle

2 Antworten

5

Obwohl Flasks Standardimplementierung für Sitzungen darin besteht, die Daten in einem Cookie zu speichern, ist dies nicht der einzige Weg, dies zu tun. In der Regel speichern Sie eine Sitzungs-ID im Cookie, und die Daten selbst werden irgendwo auf dem Server gespeichert und über diesen Cookie abgerufen.

Flask bietet Ihnen eine einfache Möglichkeit, die Standardsitzungsimplementierung zu überschreiben, und es gibt verschiedene Rezepte, die zeigen, wie das geht - hier ist eine SO-Frage, die den Umriss zeigt.

    
Daniel Roseman 18.09.2013, 13:29
quelle
4

Sie können Flask-Cache ( flask.ext.cache ) SimpleCache verwenden (was wirklich werkzeug.contrib.cache.SimpleCache ist) um die Daten im Speicher in Ihrer Anwendung zu speichern. Das einzige Problem ist, dass Sie eine Instanz des Caches pro Serverprozess haben werden (wenn Sie hinter uwsgi stehen oder auf mod_wsgi laufen, haben Sie höchstwahrscheinlich mehr als einen Prozess, der Anfragen bearbeitet). Es ist also möglich, dass ein Benutzer einen Endpunkt seiner Anwendung erreicht, den Preis bezahlt, um die Daten abzurufen, und dann bei der nächsten Anfrage einen anderen Prozess trifft und diese Kosten erneut bezahlen muss (weil Prozess A die Daten zwischengespeichert hat) , Prozess B nicht).

Die einzige Möglichkeit, dies zu umgehen, ist die Verwendung eines prozessexternen Speichers (entweder eines Caches im übergeordneten Prozess oder eines separaten Python-Prozesses, der als Cache-Server oder als Persistenzspeicher fungiert [Redis, PostGres usw.]. ])

    
Sean Vieira 18.09.2013 13:23
quelle

Tags und Links