Есть приложение, которое работает с базой данных и имеет несколько
клиентов — web-клиент, клиент на PyQt, клиент на PyGtk.
Есть желание вынести всю бизнес логику, которая сейчас содержится в
отдельный классах на отдельный узел(компьютер) в сети.
То есть, хотется написать некий сервис, который будет принимать запросы
от этих клиентов, делать запросы к базе данных и возвращать клиентам
результаты запросов, в виде объектов и их коллекций.
Вопрос — как в python между двумя различными python-программами,
работающими на разных компах в сети, можно передавать объекты и их
коллекции?
Здравствуйте, DemAS, Вы писали: DAS>Вопрос — как в python между двумя различными python-программами, DAS>работающими на разных компах в сети, можно передавать объекты и их DAS>коллекции?
До XML-RPC я уже дошел
А не знаешь — эта технология позволет возвращать с сервера на клиент классы?
Сервер:
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
# Create server
server = SimpleXMLRPCServer(("localhost", 8000),
requestHandler=RequestHandler)
server.register_introspection_functions()
class MyClass:
def __init__(self, a):
self.a = a
def say(self):
return a
def return_my_class():
return MyClass(100)
server.register_function(return_my_class, 'my_class')
# Run the server's main loop
server.serve_forever()
Клиент:
import xmlrpclib
s = xmlrpclib.ServerProxy('http://localhost:8000')
o = s.my_class()
print o
o.say()
Вывод:
{'a': 100}
Traceback (most recent call last):
File "rpc_client.py", line 7, in <module>
o.say()
Я кончено понимаю, что я могу на сервере сериализовать класс в список, а
на клиенте из списка восстановить класс, но не хочется изобретать
велосипед.
Здравствуйте, DemAS, Вы писали: DAS>А не знаешь — эта технология позволет возвращать с сервера на клиент классы?
Полагаю, если прикрутить pickle — то можно. Здесь что-то по этому поводу есть, но в несколько негативной окраске — мол, xml-rpc для полноценной сериализации не годится.
Еще soap можно попробовать — он вроде наоборот именно для передачи обектов предназначался.
Здравствуйте, DemAS, Вы писали:
DAS>Есть приложение, которое работает с базой данных и имеет несколько DAS>клиентов — web-клиент, клиент на PyQt, клиент на PyGtk.
DAS>Есть желание вынести всю бизнес логику, которая сейчас содержится в DAS>отдельный классах на отдельный узел(компьютер) в сети.
DAS>То есть, хотется написать некий сервис, который будет принимать запросы DAS>от этих клиентов, делать запросы к базе данных и возвращать клиентам DAS>результаты запросов, в виде объектов и их коллекций.
DAS>Вопрос — как в python между двумя различными python-программами, DAS>работающими на разных компах в сети, можно передавать объекты и их DAS>коллекции?
Я бы посоветовал использовать библиотеку Zeroc ICE. Конечно, возможно она будет немного overkill-ом в этом, возможно, простом случае, но зато она предоставляет удобный RPC(хотя с первого взгляда он может показаться нетривиальным), а также (де)сериализацию. Ну и еще кучу плюшек