Объедините 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.

person TimothyP    schedule 24.08.2010    source источник


Ответы (3)


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

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

person Wai Yip Tung    schedule 24.08.2010
comment
Это помогло мне найти свои решения - person TimothyP; 25.08.2010

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

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

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

    def do_GET(self):
          #implementation here

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

person TimothyP    schedule 25.08.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()
person leoluk    schedule 24.08.2010
comment
Проблема в том, что я не могу установить apache на целевое устройство (яблочное устройство с ограниченным доступом: p) - person TimothyP; 25.08.2010