python - 如何通过WebKit发送POST请求[PySide/PyQt]

标签 python pyqt pyside

使用PySide,如何从python代码中的webkit表单获取POST数据?

这是我的简单代码:

    import sys 
    from PySide.QtCore import * 
    from PySide.QtGui import QApplication 
    from PySide.QtWebKit import QWebView 

    html = """ 
    <html> 
    <body> 
        <form action="" method="post"><input name="test" /><input type="submit" value="submit"/></form>
    </body> 
    </html> 
    """ 


    if __name__ == '__main__': 
        app = QApplication(sys.argv) 
        view = QWebView() 
        frame = view.page().mainFrame() 
        view.setHtml(html) 
        view.show() 
        app.exec_()

我想获取我提交的字符串[key=test]

最佳答案

通过将自定义 createRequest 虚拟函数绑定(bind)到网络管理器,您可以看到正在发布的数据:

注意:使用data.readAll()将清空顺序QIODevice,因此稍后webkit将无法访问数据,并且不会发布任何内容。使用data.peak(1024) 在不丢失数据的情况下也会有同样的效果,唯一的不便是你必须传递你想要读取的数据大小。

import sys 
from PySide.QtCore import * 
from PySide.QtGui import QApplication 
from PySide.QtWebKit import QWebView, QWebPage
from PySide.QtNetwork import QNetworkAccessManager

html = ''' 
<html> 
<body> 
    <form action="http://www.google.com" method="post"><input type="text" name="test" /><input type="submit" value="submit"/></form>
</body> 
</html> 
''' 

class Browser(object):

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

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

        self.web_view = QWebView()
        self.web_view.setPage(self.web_page)

        self.html_data = None

    def _create_request(self, operation, request, data):
        # data contains all the post data that is being added to the request
        # so you can look into it here
        print data.readAll()
        reply = QNetworkAccessManager.createRequest(self.network_manager,
                                                    operation,
                                                    request,
                                                    data)
        return reply

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    browser = Browser() 
    frame = browser.web_page.mainFrame() 
    browser.web_view.setHtml(html) 
    browser.web_view.show() 
    app.exec_()

关于python - 如何通过WebKit发送POST请求[PySide/PyQt],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12345841/

相关文章:

pyqt4 - 如何在 QLineEdit 中插入按钮

python - 未能在qt快速应用程序中构建图形管道状态

python - 删除所选项目上的虚线矩形

PyQt:QTreeView 和 QAbstractItemModel 的人类语言

python - PyQt 允许枚举值和字符串

python - AWS Systems Manager "In Progress"命令限制为 5 个?

python - 如何将某些行文本、可变位置移动到特定列

python - 使用 flask 上传两个不同位置的文件

python - 如何将 Flask 路由与 Apache 和 mod_wsgi 一起使用?

sqlite - 无法使用QtSqlDriver从带有“。”的表中检索数据在列名中