POST-запрос с использованием QWebView-запроса
Привет! Я работаю с pyqt4, и я хочу создать произвольный POST-запрос, используя QtWebKit-запрос моего QWebPage/QWebView. При тщательном осмотре вокруг я понимаю, что мне нужно создать подкласс networkaccessmanager, переопределив createRequest()
метод.
Я видел пример, который позволял использовать четвертый параметр createRequest для извлечения данных отправляемого запроса POST (см. Код ниже), но мой вопрос заключается в том, как установить ту же переменную данных createRequest для отправки пользовательских данных POST, как "запрос = мое значение"?
По-видимому, данные 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_()
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_()