【问题标题】:POST request using QWebView request使用 QWebView 请求的 POST 请求
【发布时间】:2012-10-11 23:48:42
【问题描述】:

您好,我正在使用 pyqt4,我想做的是通过使用我的 QWebPage/QWebView 的 QtWebKit 请求来制作任意 POST 请求。通过广泛研究我的理解是,我必须通过覆盖 createRequest() 方法来继承 networkaccessmanager。

我看到了一个示例,它允许使用 createRequest 的第四个参数来提取正在发送的 POST 请求(见下面的代码)的数据,但我的问题是如何设置 createRequest 的相同数据变量来发送自定义POST 数据,例如“query=myvalue”?

显然 data 是一个 QIODevice 变量:我尝试了很多不同的方法来设置它,但无法让它工作,并且总是以 python 抱怨它是一个意外的值而告终。我在这里错过了什么吗?有人愿意分享一个工作代码示例吗?

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

【问题讨论】:

  • 您要发送一个全新的 POST 请求还是即时修改现有请求的参数?
  • 为了了解知识,我很想知道如何动态修改现有参数的参数,因为我知道如何发送全新的请求。随意张贴在这里,我在任何地方都找不到具体的帮助,所以我相信它也会使其他人受益。干杯。

标签: python pyqt pyside qwebview qwebkit


【解决方案1】:

您发布的代码来自我的一个答案,所以我也有义务回答这个问题:)

from PySide.QtCore import QByteArray, QUrl
from PySide.QtGui import QApplication  
from PySide.QtWebKit import QWebView, QWebPage 
from PySide.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply


class Browser(object):

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

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

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

    def _create_request(self, operation, request, data):
        print data.readAll()
        reply = QNetworkAccessManager.createRequest(self.network_manager,
                                                    operation,
                                                    request,
                                                    data)
        return reply

    def _request_finished(self, reply):
        if not reply.error() == QNetworkReply.NoError:
            # request probably failed
            print reply.error()
            print reply.errorString()

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

    def _urlencode_post_data(self, post_data):
        post_params = QUrl()
        for (key, value) in post_data.items():
            post_params.addQueryItem(key, unicode(value))

        return post_params.encodedQuery()

    def perform(self, url, method='GET', post_data=dict()):
        request = self._make_request(url)

        if method == 'GET':
            self.web_view.load(request)
        else:
            encoded_data = self._urlencode_post_data(post_data)
            request.setRawHeader('Content-Type',
                                 QByteArray('application/x-www-form-urlencoded'))
            self.web_view.load(request,
                               QNetworkAccessManager.PostOperation,
                               encoded_data)

if __name__ == '__main__':
    app = QApplication([])
    browser = Browser()
    browser.perform('http://www.python.org', 'POST', {'test': 'value', 'anothername': 'gfdgfd'})
    app.exec_()

【讨论】:

  • 非常感谢 Andrean,它运行良好。我一直在尝试很多不同的事情,但都没有成功,现在我发现它实际上并没有我想象的那么简单。再次,非常感谢你! :)
  • 如果你不介意,你可以接受它作为正确答案:)
  • @andrean 请也看一下这个问题-stackoverflow.com/questions/37041316/…,我知道您解决问题不会超过一分钟,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
相关资源
最近更新 更多