使用 Webkit 为 Python 桌面应用程序嵌入 WSGI 后端

8 投票
3 回答
961 浏览
提问于 2025-04-16 03:01

免责声明:我对问题标题中提到的内容不是很熟悉。

有没有可能使用浏览器控件(比如Webkit)作为WSGI应用的前端(使用像Flask这样的框架),而不启动本地的WSGI服务器呢?

简单来说,请求和响应是通过一个中间层来管理的,这个中间层在HTML界面和WSGI后端之间。某个特定的URI可以表示“本地”,比如“local://”或者类似的东西,这样就可以把请求转发到嵌入的WSGI应用,并保留所有原始的头信息等。

如果不自己实现,或者以某种方式嵌入一个可以通过API使用的服务器,而不是通过真实的HTTP请求,你将失去普通WSGI服务器提供的任何功能。

现在想想,这其实是唯一真正的要求:一个可以通过API调用的WSGI服务器,而不仅仅是通过真实的HTTP请求。

我知道这样做的实用性是值得怀疑的(甚至可能没有意义)。我的问题是,这样做到底可不可行?

编辑:换句话说:

我想要一个代码库同时作为一个网页应用和一个桌面应用,使用HTML前端和Python后端。我不想在桌面应用上运行任何端口的服务器。实现这个目标的最简单方法是什么?

3 个回答

0

我来更新一下这个话题,因为我们也遇到了同样的问题,并且准备把事情从一个视图/小部件扩展到整个应用程序。

我做的就是把基础网址设置为一个可以提供静态内容的地方,从一个QRC文件中获取,这样很简单:

html = jinjatemplate.render(...)
self._mainFrame.setHtml(html.decode('utf-8'), Qt.QUrl('qrc:///Orsync/html/'))

在通信方面,我们的HTML大部分使用jQuery的AJAX。你可以把它封装在一个层里,使用 $.post(...)api.post(...),像这样:

self._mainFrame.addToJavaScriptWindowObject('api', self._webapi)

你需要自己解码网址并创建一个请求对象,但这可能并不难吧?我们目前使用的网址非常少(直接映射到Python对象/函数),所以自己做映射很简单。

返回的数据只是通过 QMainFrame.evaluateJavaScript(...) 发送的,可以是直接的Qt调用,也可以是一堆通过 $.getScript(...) 获取的代码行(这会直接执行接收到的代码)。

我目前正在用CherryPy稍微重建一下东西,它可以直接把网址映射到Python对象,所以我希望能从中获得一些好处。

否则,我希望能在命名管道上运行QWebKit,或者其他类似的本地化方式,而不是使用tcp套接字。:)

0

今天早些时候,我正好看到了你所问的内容——一种通过API调用WSGI的方法,而不需要真正通过网络连接。不过,这应该不会太难。

顺便提一下,你可能想看看PySide,特别是它能将Python元素绑定到DOM事件的功能。如果你只是想触发一些Python代码,那这样做会更简单。

如果你能多提供一些你希望实现的目标,我们或许能更好地帮你找到解决方案。

1

理论上,你可以自己写一个 WSGI 容器,这个容器可以实现完整的 API,并且把它适配到 WSGI 上。你可以看看 flup,也许会给你一些灵感。

撰写回答