Объедините SimpleXMLRPCServer и BaseHTTPRequestHandler в Python

Поскольку междоменные запросы 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 ответа

Решение

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

Все, что мне нужно было сделать, это продолжать использовать экземпляр SimpleXMLRPCServer, но изменить обработчик:

class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

    def do_GET(self):
          #implementation here

Это заставит обработчик отвечать на запросы GET, а также на исходные запросы POST (XML-RPC).

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

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

С помощью 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()
Другие вопросы по тегам