gpt4 book ai didi

python - 每个 Flask session 存储大量数据或服务连接

转载 作者:太空宇宙 更新时间:2023-11-03 20:45:34 25 4
gpt4 key购买 nike

我正在编写一个小型 Flask 应用程序,并使用 pyRserve 将其连接到 Rserve。我希望每个 session 都启动并维护自己的 Rserve 连接。

类似这样的事情:

session['my_connection'] = pyRserve.connect()

不起作用,因为连接对象不可 JSON 序列化。另一方面,类似这样的事情:

flask.g.my_connection = pyRserve.connect()

不起作用,因为它在请求之间不会持续存在。更困难的是,pyRserve 似乎没有为连接提供任何标识符,因此我无法在 session 中存储连接 ID 并使用它在每个请求之前检索正确的连接。

有没有办法实现每个 session 都有唯一的连接?

最佳答案

以下内容适用于您不想为每个请求重新创建的任何全局 Python 数据,而不仅仅是 rserve,也不仅仅是每个用户唯一的数据。

我们需要一些公共(public)位置来为每个用户创建 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
<小时/>

我们可以在请求期间使用一个简单的函数从应用程序访问此管理器。这假设您在 session 中获得了“user_id”的值(例如,Flask-Login 会执行此操作)。这最终使 rserve 连接对每个用户来说都是唯一的,而不是每个 session 。

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

在 View 中访问它:

result = get_rserve().eval('3 + 5')
<小时/>

这应该可以帮助您入门,尽管还有很多可以改进的地方,例如不硬编码地址和密码,以及不丢弃与管理器的连接。这是用 Python 3 编写的,但应该可以与 Python 2 一起使用。

关于python - 每个 Flask session 存储大量数据或服务连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56629362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com