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

2024-11-26 08:37:00
admin
原创
108
摘要:问题描述:我正在编写一个小型 Flask 应用程序,并让它使用 pyRserve 连接到 Rserve。我希望每个会话都启动并维护自己的 Rserve 连接。像这样:session['my_connection'] = pyRserve.connect() 不起作用,因为连接对象不是 JSON 可序列化的。另...

问题描述:

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

像这样:

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

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

flask.g.my_connection = pyRserve.connect()

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

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


解决方案 1:

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

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

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

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

在视图中访问它:

result = get_rserve().eval('3 + 5')

这应该可以让你入门,尽管还有很多可以改进的地方,例如不对地址和密码进行硬编码,以及不丢弃与管理器的连接。这是用 Python 3 编写的,但应该适用于 Python 2。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1043  
  IPD(Integrated Product Development,集成产品开发)是一种系统化的产品开发方法论,旨在通过跨职能团队的协作,优化产品开发的效率和质量。IPD流程强调从市场需求出发,通过并行工程、跨部门协作和阶段性评审,确保产品从概念到上市的每个环节都高效且可控。随着敏捷开发方法的普及,越来越多的企业开始...
华为IPD流程   41  
  随着企业产品开发复杂度的提升以及市场需求的快速变化,传统的产品开发模式逐渐显现出局限性。集成产品开发(IPD)流程与敏捷开发(Agile Development)作为两种主流的开发方法论,分别从系统化管理和快速响应需求的角度为企业提供了解决方案。然而,单独使用其中一种方法往往无法完全满足企业在效率、质量和创新上的多重需...
华为IPD流程   35  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司成功的关键因素之一。它不仅帮助华为在技术上实现了快速创新,还通过市场导向确保了产品的商业成功。IPD流程通过整合技术与市场双驱动,实现了从需求定义到产品交付的全生命周期管理。这种模式不仅提高了产品的开发效率,还降低了市...
IPD流程中PDCP是什么意思   32  
  在研发领域,集成产品开发(IPD)流程已经成为企业提升创新效率和市场竞争力的重要手段。然而,资源分配的不合理往往是制约IPD流程效率的关键因素之一。无论是人力资源、财务资源还是技术资源,如何高效分配直接关系到项目的成功与否。优化资源分配不仅能够缩短产品开发周期,还能降低研发成本,提升产品的市场竞争力。因此,掌握资源分配...
IPD流程中CDCP   34  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用