Форум сайта python.su
Есть приложение, которое работает с базой данных и имеет несколько клиентов - web-клиент, клиент на PyQt, клиент на PyGtk.
Есть желание вынести всю бизнес логику, которая сейчас содержится в отдельный классах на отдельный узел(компьютер) в сети.
То есть, хотется написать некий сервис, который будет принимать запросы от этих клиентов, делать запросы к базе данных и возвращать клиентам результаты запросов, в виде объектов и их коллекций.
Вопрос - как в python между двумя различными python-программами, работающими на разных компах в сети, можно передавать объекты и их коллекции?
Офлайн
самое простое что можно придумать asynchat+pickle
ну или вот например http://docs.python.org/library/simplexmlrpcserver.html
Отредактировано (Апрель 9, 2009 15:30:57)
Офлайн
А 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()
print s.system.listMethods()
Офлайн
люди читаем что вообще пишем
server.register_function(return_my_class, 'my_class')
Офлайн
RPyC
Pyro
Мне RPyC больше нравиться.
Но, как всегда, серебрянной пули нет, и мозг включать нужно в любом случае.
Офлайн
Ну я бы использовал кроссплатформенные решения, скрывающие детали реализации app-сервера. Лучше всего, IMHO, REST. XML RPC тож нормально но если “чтобы работало почти прозрачно”, то RPyC хороший вариант. Только да, согласен с Андреем Светловым, нужно не забывать включать мозг.
Офлайн
register_function`у кормиш класс, разве так можно, а я яй :\ читай доку!
А что надо было использовать?
Есть register_instance() - но он просто делает на клиент доступными методы экземпляра класса, причем эти меоды не видят переменных класса:
Сервер:
class MyClass:
def __init__(self, a):
self.a = a
def say(self):
return a
server.register_instance(MyClass(100))
import xmlrpclib
s = xmlrpclib.ServerProxy('http://localhost:8000')
s.say()
Офлайн
Хотя в общем то, я уже свыкся с идеей упаковки экземпляров классов в контейнеры на сервере и воссоздание классов из контейнера на клиенте.
Надо только найти максимально удобный для этого способ.
Офлайн
RPyc и Pyro посмотрю.
Спасибо.
Офлайн
j2a
REST - лучший. Но только тема несколько выходит за рамки топика. Поэтому с ходу настоятельно советовать поостерегся.
Проблема для RPyC очень простая: можно не заметить, что твой код уже перелез на сервер и потому жутко тормозит.
Проблема включения мозга - не всегда очевидная. Я уже писал, что пользуясь безнаказанностью pickle пропихивали абсолютно ненужные и избыточные данные через сеть (и удивлялись, почему определенные regression показывают от билда к билду все более плачевные результаты). Могу сказать в свое оправдание лишь одно: это была не моя команда и я за их работой не следил.
Но, тем не менее, с самого начала рекомендовал бы RPyC. А потом можно заменить протокол на более строгий и быстро надавать по рукам тем, кто вообразил себе невесть чего. Если соображалка уже работает, конечно же.
Так мигрировать и обучаться, ИМХО, легче.
Офлайн