gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:16:29 32 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/54635585/

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