簡體   English   中英

如何保持python qtwebkit實例運行和持久化?

[英]How to keep python qtwebkit instance running and persistent?

我需要我的Python QtWebKit腳本保持運行並監聽其他命令。 現在,如果用戶連接並向服務器發送命令,則服務器端腳本將在完成后立即運行並退出。

例如,如果用戶輸入URL進行導航,則QtWebKit將獲取URL並進行呈現。 他們可能希望在某個時候發送登錄命令並查看該頁面的屏幕截圖。 腳本開始,導航到URL並登錄,然后獲取該頁面的屏幕截圖。

有什么方法可以讓腳本不必從頭開始就可以監聽未來的命令?

預期結果:用戶向服務器發送命令,QtWebKit加載URL並保持打開狀態。 用戶發送命令登錄並截取屏幕截圖,而QtWebKit登錄並截取屏幕截圖,而無需重新啟動腳本。

此處的特殊情況是用戶不會提前知道他希望執行的命令的確切順序。 因此,用戶無法將A到Z拼寫清楚並讓腳本一次運行。

我使用twisted將一個簡單的xmlrpc服務器設置為后端,它是持久性的,並且有任務根據需要創建基於PyQt / PySide的Webkit瀏覽器的新實例,或者重用現有的瀏覽器。 一個單獨的前端Web應用程序(即用戶和后端應用程序之間的“中間人”)將命令與session_id一起發送到扭曲的xmlrpc服務器,如果session_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()

而客戶端只是為了測試功能:

# -*- coding: utf-8 -*-
import xmlrpclib

def test_server(port=1234):
    s = xmlrpclib.Server('http://localhost:{0}/'.format(port))
    session_id = 'a1b2c3d4e5f6'
    html = s.open({'url': 'http://www.google.com'}, session_id)
    print unicode(html).encode('utf-8')
    html = s.open({'url': 'http://www.ubuntu.com'}, session_id)
    print unicode(html).encode('utf-8')

    session_id = 'f6e5d4c3b2a1'
    html = s.open({'url': 'http://www.yahoo.com'}, session_id)
    print unicode(html).encode('utf-8')

if __name__ == '__main__':
    test_server()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM