当前位置: 首页 > 面试题库 >

Python-在Flask会话中存储大数据或服务连接

徐博雅
2023-03-14
问题内容

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

像这样:

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

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

flask.g.my_connection = pyRserve.connect()

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

有没有办法完成每个会话的唯一连接?


问题答案:

以下内容适用于你不想为每个请求重新创建的所有全局Python数据,不仅适用于保留,而且适用于每个用户唯一的数据。

我们需要一些公共位置来为每个用户创建一个保留连接。最简单的方法是将a 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会执行的操作)。这样最终使每个用户(而不是每个会话)的保留连接都是唯一的。

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一起使用。



 类似资料:
  • 问题内容: 我想知道是否有可能直接在Flask会话中存储对象,而无需重写序列化程序。为了使此功能正常工作,我需要在课堂上实现任何功能吗?下面的示例代码。这就是我想要的样子。但是,当您尝试执行该操作时,它会抛出错误信息TypeError: Object of type ‘Test’ is not JSON serializable 任何帮助是极大的赞赏!提前致谢!:) 问题答案: 使对象序列化并实现

  • 当我运行它时,我得到一个no this session错误。

  • 问题内容: 我在整个互联网上进行搜索,但是找不到答案有明确的解决方案。 我在Java中使用Selenium Webdriver。 我的测试需要验证何时保存登录信息,然后关闭浏览器并重新打开,然后这些凭据仍然保留并保存在新会话中。因此,我想关闭当前会话并重新打开它,以验证cookie是否仍保留在页面上,但是Selenium删除了所有存储的会话数据,因此测试用例将始终失败。在针对特定测试用例关闭浏览器

  • 问题内容: 我在整个互联网上进行搜索,但是找不到答案有明确的解决方案。 我在Java中使用Selenium Webdriver。 我的测试需要验证何时保存登录信息并关闭浏览器并重新打开,然后这些凭据仍然保留并保存在新会话中。因此,我想关闭当前会话并重新打开它,以验证cookie是否仍保留在页面上,但是Selenium删除了所有存储的会话数据,因此测试用例将始终失败。关闭特定测试用例的浏览器后,是否

  • 我在两台服务器的memcache上都面临会话存储问题。我在云服务器上安装了memcached 3)vi/etc/sysconfig/memcached并添加 port=“11211” user=“memcached” maxconn=“1024” cachesize=“264” options=“-l 127.0.0.1”//,我尝试将服务器1的ip放在服务器1的memcache配置文件上,将服务