在 Flask 会话中维护唯一连接
问题:
在 Flask 应用程序中,需要为每个用户会话建立并维护与服务(在本例中为 Rserve)的唯一连接。由于连接对象非 JSON 可序列化,在会话中存储连接对象会失败,而使用flask.g 并不能确保持久性。
解决方案:
为了解决这个问题,我们通过使用 multiprocessing.Manager 将 Rserve 连接的创建与用户请求分开。该外部进程管理每个用户的连接。代码如下:
单独的管理器进程(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()
从 Flask 应用程序访问管理器:
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
在查看:
result = get_rserve().eval('3 + 5')
此方法为每个用户提供唯一的连接,从而能够在 Flask 应用程序中维护特定于会话的数据或服务连接。
以上是如何在 Flask 中维护每个用户会话的唯一 Rserve 连接?的详细内容。更多信息请关注PHP中文网其他相关文章!