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

标签 python r flask rserve pyrserve

我正在编写一个小型 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/28423069/

相关文章:

r - 复杂热图突出显示特定行

ajax - 从POST方法重定向后出现 flask 错误

python-2.7 - Flask Web 应用程序未响应 EC2 上的外部请求

python - 是否可以在 seaborn.barplot 中为每个单独的条形图添加影线?

Python AJAX 响应字符串文字

r - 如何自动启动我的 ec2 实例,运行命令然后将其关闭?

postgresql - Bcrypt 无效盐和 Postgresql

javascript - 在 javascript 中从 prompt.get trim 换行符

javascript - 使用Python-Selenium过滤信息时点击不起作用

r - 为什么当 class(a$alpha) 返回 "-none-"时 summary(a$alpha) 返回 class "numeric"?