Объедините SimpleXMLRPCServer и BaseHTTPRequestHandler в Python - PullRequest
3 голосов
/ 25 августа 2010

Поскольку междоменные запросы xmlrpc в JavaScript невозможны, мне нужно создать приложение Python, которое предоставляет некоторые HTML-данные через HTTP и службу XML-RPC в одном домене.

Создание обработчика запросов HTTPи SimpleXMLRPCServer в python довольно прост, но они оба должны слушать другой порт, что означает другой домен.

Есть ли способ создать что-то, что будет прослушивать один порт на локальном хосте и выставлятьи обработчик HTTPRequestHandler и XMLRPCRequest?

Сейчас у меня есть два разных сервиса:

httpServer = HTTPServer(('localhost',8001), HttpHandler);
xmlRpcServer = SimpleXMLRPCServer(('localhost',8000),requestHandler=RequestHandler)

Обновление

  • Я не могу установить Apacheна устройстве
  • Размещенной страницей будет отдельная html-страница
  • Единственным клиентом будет устройство, на котором работает служба python

Ответы [ 3 ]

2 голосов
/ 25 августа 2010

Оба они подкласс SocketServer.TCPServer. Должен быть какой-то способ их рефакторинга, чтобы один раз экземпляр сервера мог отправлять их обоим.

Более простой альтернативой может быть сохранение HTTPServer впереди и RPC XML RPC для экземпляра SimpleXMLRPCServer.

2 голосов
/ 25 августа 2010

Решение было на самом деле довольно простым, основываясь на ответе Вай Ип Туна:

Все, что мне нужно было сделать, это продолжать использовать экземпляр SimpleXMLRPCServer, но изменить обработчик:заставит обработчик отвечать на запросы GET, а также на исходные запросы POST (XML-RPC).

0 голосов
/ 25 августа 2010

Использование HTTPServer для предоставления содержимого не очень хорошая идея.Вы должны использовать веб-сервер, такой как Apache, и использовать Python в качестве CGI (или более продвинутый интерфейс, такой как mod_wsgi).

Затем веб-сервер работает на одном порту, и вы можете сервер HTML напрямую через веб-сервер и писатьстолько скриптов CGI, сколько вам нужно в Python, например, один для запросов XMLRPC с использованием CGIXMLRPCRequestHandler.

class MyFuncs:
    def div(self, x, y) : return x // y


handler = CGIXMLRPCRequestHandler()
handler.register_function(pow)
handler.register_function(lambda x,y: x+y, 'add')
handler.register_introspection_functions()
handler.register_instance(MyFuncs())
handler.handle_request()
...