每个 Flask 会话存储大数据或服务连接
- 2024-11-26 08:37:00
- admin 原创
- 108
问题描述:
我正在编写一个小型 Flask 应用程序,并让它使用 pyRserve 连接到 Rserve。我希望每个会话都启动并维护自己的 Rserve 连接。
像这样:
session['my_connection'] = pyRserve.connect()
不起作用,因为连接对象不是 JSON 可序列化的。另一方面,像这样:
flask.g.my_connection = pyRserve.connect()
不起作用,因为它在请求之间不会持续存在。更困难的是,pyRserve 似乎没有为连接提供任何标识符,所以我无法在会话中存储连接 ID,并在每次请求之前使用该 ID 检索正确的连接。
有没有办法实现每个会话都有一个唯一的连接?
解决方案 1:
以下内容适用于您不想为每个请求重新创建的任何全局 Python 数据,而不仅仅是 rserve,也不仅仅是每个用户独有的数据。
我们需要一些公共位置来为每个用户创建 rserve 连接。最简单的方法是将其multiprocessing.Manager
作为单独的进程运行。
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()
在启动应用程序之前运行它,以便管理器可用:
python rserve_manager.py
我们可以在请求期间使用一个简单的函数从应用程序访问此管理器。这假设您在会话中获得了“user_id”的值(例如,Flask-Login 会这样做)。这最终使 rserve 连接对每个用户都是唯一的,而不是每个会话。
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')
这应该可以让你入门,尽管还有很多可以改进的地方,例如不对地址和密码进行硬编码,以及不丢弃与管理器的连接。这是用 Python 3 编写的,但应该适用于 Python 2。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
热门标签
云禅道AD