首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储每个Flask会话的大数据或服务连接

存储每个Flask会话的大数据或服务连接
EN

Stack Overflow用户
提问于 2015-02-10 10:27:12
回答 1查看 9.4K关注 0票数 14

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

如下所示:

代码语言:javascript
复制
session['my_connection'] = pyRserve.connect()

不起作用,因为connection对象不是JSON可序列化的。另一方面,类似这样的东西:

代码语言:javascript
复制
flask.g.my_connection = pyRserve.connect()

不起作用,因为它不会在请求之间持久。雪上加霜的是,pyRserve似乎没有为连接提供任何标识符,所以我不能在会话中存储连接ID,并在每次请求之前使用它检索正确的连接。

有没有一种方法可以实现每个会话具有唯一的连接?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-10 16:07:41

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

我们需要一些公共位置来为每个用户创建一个rserve连接。最简单的方法是将multiprocessing.Manager作为单独的进程运行。

代码语言:javascript
复制
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()

在启动应用程序之前运行它,以便管理器可用:

代码语言:javascript
复制
python rserve_manager.py

在请求期间,我们可以使用一个简单的函数从应用程序访问此管理器。这假设您已经在会话中获得了"user_id“的值(例如,这就是Flask-Login所做的事情)。这最终使得每个用户的rserve连接是唯一的,而不是每个会话。

代码语言:javascript
复制
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

在视图中访问它:

代码语言:javascript
复制
result = get_rserve().eval('3 + 5')

这应该可以让您开始,尽管还有很多可以改进的地方,比如不对地址和密码进行硬编码,以及不丢弃与管理器的连接。这是用Python3编写的,但应该可以用Python2。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28423069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档