2012-10-22 83 views
1

嗨我正在使用pyqt4,我想要做的是通過使用QWebPage/QWebView的QtWebKit請求來製作任意的POST請求。通過廣泛地瞭解我的理解,我必須通過重寫createRequest()方法來繼承networkaccessmanager。使用QWebView請求的POST請求

我看到一個例子,它允許使用createRequest的第四個參數來提取發送的POST請求(見下面的代碼)的數據,但我的問題是如何設置createRequest的相同數據變量來發送自定義POST數據,如「query = myvalue」?

顯然數據是一個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_() 
+0

你想發送一個完全地新的POST請求或修改的參數現有的一個在飛行? – alexisdm

+0

爲了知識的緣故,我很想知道如何修改現有參數,現在我知道如何發送全新的請求。隨時在這裏發佈,我找不到任何具體的幫助,所以我相信它會讓別人受益。乾杯。 –

回答

3

您發佈的代碼是從我的答案之一,所以我覺得有義務要回答這個問題太:)

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

非常感謝Andrean,它非常完美。我一直在嘗試很多不同的事情,但我現在看到它實際上比我想象的要微不足道。再次,謝謝你! :) –

+0

好吧,你可以接受它作爲正確的答案,如果你不介意:) – andrean

+0

@andrean請看看這個問題以及-http://stackoverflow.com/questions/37041316/see-post-request-in-webkitpyqt- python,我知道解決這個問題不會超過一分鐘,謝謝 – ashish