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:
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?
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.
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.]. ])