Найти - Пользователи
Полная версия: middle tier
Начало » Web » middle tier
1 2
demas
Есть приложение, которое работает с базой данных и имеет несколько клиентов - web-клиент, клиент на PyQt, клиент на PyGtk.

Есть желание вынести всю бизнес логику, которая сейчас содержится в отдельный классах на отдельный узел(компьютер) в сети.

То есть, хотется написать некий сервис, который будет принимать запросы от этих клиентов, делать запросы к базе данных и возвращать клиентам результаты запросов, в виде объектов и их коллекций.

Вопрос - как в python между двумя различными python-программами, работающими на разных компах в сети, можно передавать объекты и их коллекции?
evgenyl
самое простое что можно придумать asynchat+pickle
ну или вот например http://docs.python.org/library/simplexmlrpcserver.html
demas
А 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()
Выводит:
{'a': 100}
Traceback (most recent call last):
File “rpc_client.py”, line 7, in <module>
o.say()
AttributeError: ‘dict’ object has no attribute ‘say’
evgenyl
люди читаем что вообще пишем
server.register_function(return_my_class, 'my_class')
register_function`у кормиш класс, разве так можно, а я яй :\ читай доку!
Андрей Светлов
RPyC
Pyro
Мне RPyC больше нравиться.
Но, как всегда, серебрянной пули нет, и мозг включать нужно в любом случае.
j2a
Ну я бы использовал кроссплатформенные решения, скрывающие детали реализации app-сервера. Лучше всего, IMHO, REST. XML RPC тож нормально но если “чтобы работало почти прозрачно”, то RPyC хороший вариант. Только да, согласен с Андреем Светловым, нужно не забывать включать мозг.
demas
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()
Результат:

demas@fedora ~/sources/study/python $ python rpc_client.py
Traceback (most recent call last):
File “rpc_client.py”, line 5, in <module>
s.say()
File “/usr/lib/python2.5/xmlrpclib.py”, line 1150, in __call__
return self.__send(self.__name, args)
File “/usr/lib/python2.5/xmlrpclib.py”, line 1440, in __request
verbose=self.__verbose
File “/usr/lib/python2.5/xmlrpclib.py”, line 1204, in request
return self._parse_response(h.getfile(), sock)
File “/usr/lib/python2.5/xmlrpclib.py”, line 1343, in _parse_response
return u.close()
File “/usr/lib/python2.5/xmlrpclib.py”, line 790, in close
raise Fault(**self._stack)
xmlrpclib.Fault: <Fault 1: “<type ‘exceptions.NameError’>:global name ‘a’ is not defined”>
demas
Хотя в общем то, я уже свыкся с идеей упаковки экземпляров классов в контейнеры на сервере и воссоздание классов из контейнера на клиенте.
Надо только найти максимально удобный для этого способ.
demas
RPyc и Pyro посмотрю.
Спасибо.
Андрей Светлов
j2a
REST - лучший. Но только тема несколько выходит за рамки топика. Поэтому с ходу настоятельно советовать поостерегся.

Проблема для RPyC очень простая: можно не заметить, что твой код уже перелез на сервер и потому жутко тормозит.
Проблема включения мозга - не всегда очевидная. Я уже писал, что пользуясь безнаказанностью pickle пропихивали абсолютно ненужные и избыточные данные через сеть (и удивлялись, почему определенные regression показывают от билда к билду все более плачевные результаты). Могу сказать в свое оправдание лишь одно: это была не моя команда и я за их работой не следил.

Но, тем не менее, с самого начала рекомендовал бы RPyC. А потом можно заменить протокол на более строгий и быстро надавать по рукам тем, кто вообразил себе невесть чего. Если соображалка уже работает, конечно же.

Так мигрировать и обучаться, ИМХО, легче.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB