Как можно сохранить уникальное соединение Rserve за сеанс?

Я пишу небольшое приложение Flask и подключаюсь к Rserve с помощью pyRserve. Я хочу, чтобы каждый сеанс инициировал, а затем поддерживал его собственное соединение Rserve.

Что-то вроде этого:

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

не работает, потому что объект соединения не является сериализуемым JSON. С другой стороны, что-то вроде этого:

 flask.g.my_connection = pyRserve.connect() 

не работает, потому что он не сохраняется между запросами. Чтобы добавить к сложности, похоже, что pyRserve не предоставляет идентификатор для соединения, поэтому я не могу сохранить идентификатор соединения в сеансе и использовать его для получения правильного соединения перед каждым запросом.

Есть ли способ выполнить уникальное соединение за сеанс?

One Solution collect form web for “Как можно сохранить уникальное соединение 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). Это в конечном итоге делает уникальное соединение уникальным для каждого пользователя, а не за сеанс.

 from multiprocessing.managers import BaseManager from flask import g, session def rserve_connect(): 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 = rserve_connection().eval('3 + 5') 

Это должно заставить вас начать, хотя есть много возможностей, которые можно улучшить, например, не жестко кодировать адрес и пароль, а не отбрасывать соединения с менеджером. Это было написано на Python 3, но должно работать с Python 2. У меня также не было настроено R и Rserve. Если вы получите сообщение об ошибке, оставьте комментарий, и я посмотрю, смогу ли я это исправить.

Python - лучший язык программирования в мире.