Python-在Flask会话中存储大数据或服务连接
我正在编写一个小的Flask应用程序,并使用pyRserve
将其连接到Rserve
。我希望每个会话都可以启动,然后维护自己的Rserve
连接。
像这样:
session['my_connection'] = pyRserve.connect()
不起作用,因为连接对象不可JSON序列化。另一方面,是这样的:
flask.g.my_connection = pyRserve.connect()
不起作用,因为它在请求之间不会持久存在。更麻烦的是,pyRserve
似乎并没有为连接提供任何标识符,因此我无法在会话中存储连接ID,并无法在每次请求之前使用该ID检索正确的连接。
有没有办法完成每个会话的唯一连接?
回答:
以下内容适用于你不想为每个请求重新创建的所有全局Python数据,不仅适用于保留,而且适用于每个用户唯一的数据。
我们需要一些公共位置来为每个用户创建一个保留连接。最简单的方法是将a multiprocessing.Manager
作为单独的进程运行。
import atexitfrom 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会执行的操作)。这样最终使每个用户(而不是每个会话)的保留连接都是唯一的。
from multiprocessing.managers import BaseManagerfrom 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一起使用。
以上是 Python-在Flask会话中存储大数据或服务连接 的全部内容, 来源链接: utcz.com/qa/419392.html