izy*_*yda 6 python r flask rserve pyrserve
我正在编写一个小型Flask应用程序,并使用pyRserve将其连接到Rserve.我希望每个会话都启动,然后维护自己的Rserve连接.
像这样的东西:
session['my_connection'] = pyRserve.connect()
Run Code Online (Sandbox Code Playgroud)
不起作用,因为连接对象不是JSON可序列化的.另一方面,这样的事情:
flask.g.my_connection = pyRserve.connect()
Run Code Online (Sandbox Code Playgroud)
不起作用,因为它不会在请求之间保持不变.为了增加难度,似乎pyRserve似乎没有为连接提供任何标识符,因此我无法在会话中存储连接ID,并在每次请求之前使用它来检索正确的连接.
有没有办法完成每个会话的唯一连接?
dav*_*ism 14
以下内容适用于您不希望为每个请求重新创建的任何全局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()
Run Code Online (Sandbox Code Playgroud)
在启动应用程序之前运行它,以便管理器可用:
python rserve_manager.py
Run Code Online (Sandbox Code Playgroud)
我们可以在使用简单功能的请求期间从应用程序访问此管理器.假设您在会话中有"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
Run Code Online (Sandbox Code Playgroud)
在视图中访问它:
result = get_rserve().eval('3 + 5')
Run Code Online (Sandbox Code Playgroud)
这应该可以帮助您入门,尽管有很多可以改进的地方,例如不会对地址和密码进行硬编码,也不会丢弃与管理器的连接.这是用Python 3编写的,但应该与Python 2一起使用.
归档时间: |
|
查看次数: |
3253 次 |
最近记录: |