如何保持pythonqtwebkit实例的运行和持久性?

2024-09-30 01:33:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要pythonqtwebkit脚本保持运行并监听进一步的命令。现在,如果用户连接并向服务器发送命令,服务器端脚本将在完成后运行并退出。在

如果用户在获取的URL中输入了一个URL,则会在该示例中对其进行导航。在未来的某个时候,他们可能希望发送一个登录命令并查看该页面的屏幕截图。脚本开始,导航到URL并登录,并获取该页面的屏幕截图。在

有没有办法让脚本不必从头开始就监听未来的命令?在

预期结果:用户向服务器发送命令,QtWebKit加载URL并保持打开状态。用户发送命令登录并截图,QtWebKit登录并截图,而不必重新启动脚本。在

这里的特殊情况是用户不知道他希望执行的命令的确切顺序。所以用户不能拼写出A到Z然后让脚本一次运行完。在


Tags: 用户命令脚本url示例屏幕顺序状态
1条回答
网友
1楼 · 发布于 2024-09-30 01:33:57

我使用twisted来设置一个简单的xmlrpc服务器作为后端,它是持久的,如果需要,它的任务是创建基于PyQt/PySide的webkit浏览器的新实例,或者重用现有的实例。一个单独的前端webapp是用户和后端应用程序之间的“中间人”,它将命令连同会话id一起发送到twisted xmlrpc服务器,twisted服务器可以通过它查找会话id是否已经在运行的浏览器,或者需要实例化一个新的浏览器。下面是一个简单的例子:

# -*- coding: utf-8 -*-
from pyvirtualdisplay import Display
display = Display(visible=False, size=(1024, 768), color_depth=24)
display.start()

from PySide.QtGui import QApplication
app = QApplication([])
import qt4reactor
qt4reactor.install()

from twisted.web import server
from twisted.web.xmlrpc import XMLRPC
from twisted.internet import defer
from PySide.QtWebKit import QWebView, QWebPage
from PySide.QtNetwork import QNetworkAccessManager, QNetworkRequest
from PySide.QtCore import QUrl, QByteArray


class Browser(object):

    def __init__(self):
        self.network_manager = QNetworkAccessManager()

        self.web_page = QWebPage()
        self.web_page.setNetworkAccessManager(self.network_manager)

        self.web_view = QWebView()
        self.web_view.setPage(self.web_page)
        self.web_view.loadFinished.connect(self._load_finished)

    def _load_finished(self, ok):
        # the page is loaded
        frame = self.web_view.page().mainFrame()
        self.deferred_request.callback(frame.toHtml())

    def _make_request(self, url):
        request = QNetworkRequest()
        request.setUrl(QUrl(url))
        return request

    def perform(self, request_data):
        # say request_data is a dict having keys: 'url', 'post_data'
        self.deferred_request = defer.Deferred()
        request = self._make_request(request_data['url'])
        self.web_view.load(request)

        return self.deferred_request


class TestXMLRPCServer(XMLRPC):

    def __init__(self):
        XMLRPC.__init__(self, allowNone=True)
        self.browser_instances = dict()

    def xmlrpc_open(self, request_data, session_id):
        print session_id, request_data
        try:
            browser = self.browser_instances[session_id]
            print 'using existing instance'
        except KeyError:
            browser = Browser()
            self.browser_instances[session_id] = browser
            print 'new instance created'

        return browser.perform(request_data)


def start_server(port=1234):
    from twisted.internet import reactor
    r = TestXMLRPCServer()
    reactor.listenTCP(port, server.Site(r))
    reactor.run()


if __name__ == '__main__':
    start_server()

以及一个客户机来测试功能:

^{pr2}$

相关问题 更多 >

    热门问题