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