在 Python 中结合 SimpleXMLRPCServer 和 BaseHTTPRequestHandler

发布于 2024-09-16 04:43:15 字数 574 浏览 5 评论 0原文

因为JavaScript中无法跨域xmlrpc请求 我需要创建一个 Python 应用程序,它通过 HTTP 公开一些 HTML,并在同一域上公开 XML-RPC 服务。

在 python 中创建 HTTP 请求处理程序和 SimpleXMLRPCServer 非常容易, 但它们都必须监听不同的端口,这意味着不同的域。

有没有办法创建一些可以在本地主机上的单个端口上侦听的东西 并公开 HTTPRequestHandler 和 XMLRPCRequest 处理程序?

现在我有两个不同的服务:

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

更新

  • 我无法在设备上安装 Apache
  • 托管页面将是单个 html 页面
  • 唯一的客户端将是 python 服务自行运行的设备

Because cross-domain xmlrpc requests are not possible in JavaScript
I need to create a Python app which exposes both some HTML through HTTP and an XML-RPC service on the same domain.

Creating an HTTP request handler and SimpleXMLRPCServer in python is quite easy,
but they both have to listen on a different port, which means a different domain.

Is there a way to create something that will listen on a single port on the localhost
and expose both the HTTPRequestHandler and XMLRPCRequest handler?

Right now I have two different services:

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

Update

  • I cannot install Apache on the device
  • The hosted page will be a single html page
  • The only client will be the device on witch the python service runs itself

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

寻找我们的幸福 2024-09-23 04:43:15

它们都是SocketServer.TCPServer的子类。必须有某种方式来重构它们,以便服务器实例可以分派给两者。

一个更简单的替代方案可能是将 HTTPServer 保留在前面,并将 XML RPC 代理到 SimpleXMLRPCServer 实例。

Both of them subclass of SocketServer.TCPServer. There must be someway to refactor them so that once server instance can dispatch to both.

An easier alternative may be to keep the HTTPServer in front and proxy XML RPC to the SimpleXMLRPCServer instance.

洛阳烟雨空心柳 2024-09-23 04:43:15

解决方案实际上非常简单,根据 Wai Yip Tung 的回复:

我所要做的就是继续使用 SimpleXMLRPCServer 实例,
但修改处理程序:

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

    def do_GET(self):
          #implementation here

这将导致处理程序响应 GET 请求以及原始 POST (XML-RPC) 请求。

The solution was actually quite simple, based on Wai Yip Tung's reply:

All I had to do was keep using the SimpleXMLRPCServer instance,
but modify the handler:

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

    def do_GET(self):
          #implementation here

This will cause the handler to respond to GET requests as well as the original POST (XML-RPC) requests.

紫轩蝶泪 2024-09-23 04:43:15

使用 HTTPServer 提供内容并不是一个好主意。您应该使用 Apache 等网络服务器,并使用 Python 作为 CGI(或更高级的接口,如 mod_wsgi)。

然后,Web 服务器在一个端口上运行,您可以直接通过 Web 服务器提供 HTML 服务,并用 Python 编写任意数量的 CGI 脚本,例如使用 CGIXMLRPCRequestHandler 的 XMLRPC 请求示例。

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()

Using HTTPServer for providing contents is not a good idea. You should use a webserver like Apache and use Python as CGI (or a more advanced interface like mod_wsgi).

Then, the webserver is running on one port and you can server HTML directly over the webserver and write as many CGI scripts as you like in Python, as example one for XMLRPC requests using 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()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文