Веб-сервис Python с Twisted - PullRequest
       1

Веб-сервис Python с Twisted

7 голосов
/ 11 июля 2011

Это связано с моим предыдущим вопросом Веб-сервис Python .

Я буду использовать Tornado для обмена информацией между сервером и клиентами.Там будет один сервер и N клиентов.Клиенты будут отправлять информацию (использование диска, процессы и т. Д.) Периодически (каждые 2 минуты или около того).Данные на стороне клиента будут представлены пользовательскими классами / списками.Было бы неплохо иметь те же данные на другой стороне (сервере).

У меня есть опыт работы с SOAP, и, вероятно, было бы хорошо (с достаточным временем ожидания на сервере), но лучше использоватьчто-то более легкое и питонное.Общение будет более или менее единственным клиентом -> сервером.

Как на стороне сервера, так и на стороне клиента написаны на Python.

Что я должен искать в документации Twisted для такого рода вещей?

edit: Я не спрашиваю о том, как сериализовать данные (JSON или pickle или XML и т. Д.).Я хотел бы знать, какие есть варианты Twisted для передачи данных.

С SOAP у меня были бы такие методы:

- sendDiskUsage(DiskUsage class instance)
- sendProcesses(ProcessList class instance)
- etc..

Я хотел бы знать, какие есть варианты с Twisted,Одним из них является XML-RPC, который был бы в порядке, но это не мой любимый ...

edit2: связь будет "двусторонней" - клиент будет читать задачи с сервера...

Ответы [ 4 ]

8 голосов
/ 11 июля 2011

Я рекомендую AMP . Это очень простой протокол на основе пары ключ-значение, идеально подходящий для того, что вы делаете. Перспективный брокер - еще одна альтернатива ... но она немного сложна и обычно не нужна.

AMP работает напрямую через TCP (зачем использовать HTTP?), Формат сериализации минимален и логичен. Это делает его «легким» и «питоническим» в том смысле, который вы, вероятно, имеете в виду, но эти термины можно интерпретировать несколькими различными способами.

Посмотрите на примеры AMP на Примеры витого кода , они довольно понятны. Соединения AMP являются двунаправленными, поэтому попробуйте изменить пример так, чтобы сервер запрашивал у клиента текущее использование диска. Документы API twisted.protocols.amp будут полезны здесь.

Когда вы будете готовы создать реальное приложение, прочитайте Twisted from Scratch или The Evolution of Finger .

AMP был реализован на большинстве популярных языков, но если вы ищете что-то более «массовое», protobuf - это то, что делает Google. ИМО, он слишком сложен и лишен некоторых важных функций, таких как сообщение об ошибке.

2 голосов
/ 11 июля 2011

Вы можете попробовать Twisted «Перспективный брокер».У него есть несколько приятных особенностей, таких как симметрия (между клиентом и сервером нет никакой разницы после установления соединения).Это заботится о самой сериализации.Это может быть не лучшим выбором, если вы хотите просто однонаправленное обновление статуса.

1 голос
/ 11 июля 2011

Для сериализации данных, если вы используете pickle для сериализации экземпляров пользовательских классов, убедитесь, что и сервер, и клиент имеют одинаковое определение класса в глобальном пространстве имен.

Для витой ссылки вы можетевзгляните на его документацию , особенно на части «Написание TCP-сервера» и «Написание TCP-клиента».

0 голосов
/ 11 июля 2011

Если и сервер, и клиент написаны на Python, самый простой способ - просто выполнить HTTP-запрос POST от клиента к серверу, данные которого сериализованы в выбранные объекты Python. Соленья будут нести всю оригинальную структуру объекта.

Если клиент не является питоническим процессом, тогда JSON - это путь - вы просто сериализуете объекты в JSON. Разница между соленьями и JSON заключается в том, что JSON не может переносить классы, а только данные в виде вложенных списков и диктов.

HTTP POST с полезной нагрузкой JSON - это то, что я бы сделал.

Не беспокойтесь о SOAP. WSDL и т. Д. Добавляет дополнительную сложность процессу, очень непитоничен, а библиотеки Python SOAP не так уж надежны.

В документации Twisted такого рода вещи не рассматриваются, поскольку это общая проблема Python, а не специфичная для Twisted.

...