Aufrechterhaltung einzigartiger Verbindungen in Flask-Sitzungen
Problem:
In einer Flask-Anwendung besteht die Notwendigkeit, Erstellen und pflegen Sie für jede Benutzersitzung eindeutige Verbindungen zu einem Dienst (in diesem Fall Rserve). Das Speichern des Verbindungsobjekts in der Sitzung schlägt aufgrund seiner Nicht-JSON-Serialisierbarkeit fehl, während die Verwendung von flask.g keine Persistenz gewährleistet.
Lösung:
Um dieses Problem zu lösen, haben wir Trennen Sie die Erstellung von Rserve-Verbindungen von den Benutzeranforderungen, indem Sie einen Multiprocessing-Manager verwenden. Dieser externe Prozess verwaltet die Verbindungen für jeden Benutzer. Hier ist der Code:
Separater Manager-Prozess (rserve_manager.py):
import atexit from multiprocessing import Lock from multiprocessing.managers import BaseManager import pyRserve connections = {} lock = Lock() def get_connection(user_id): with lock: if user_id not in connections: connections[user_id] = pyRserve.connect() return connections[user_id] @atexit.register def close_connections(): for connection in connections.values(): connection.close() manager = BaseManager(('', 37844), b'password') manager.register('get_connection', get_connection) server = manager.get_server() server.serve_forever()
Zugriff auf den Manager über die Flask-Anwendung:
from multiprocessing.managers import BaseManager from flask import g, session def get_rserve(): if not hasattr(g, 'rserve'): manager = BaseManager(('', 37844), b'password') manager.register('get_connection') manager.connect() g.rserve = manager.get_connection(session['user_id']) return g.rserve
Verwendung in a Ansicht:
result = get_rserve().eval('3 + 5')
Dieser Ansatz stellt einzigartige Verbindungen pro Benutzer bereit und ermöglicht die Pflege sitzungsspezifischer Daten- oder Dienstverbindungen in Flask-Anwendungen.
Das obige ist der detaillierte Inhalt vonWie pflege ich eindeutige Rserve-Verbindungen pro Benutzersitzung in Flask?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!