QtWebKit:控制每个http请求可以消耗的时间
Posted
技术标签:
【中文标题】QtWebKit:控制每个http请求可以消耗的时间【英文标题】:QtWebKit: Control the time that each http request could consume 【发布时间】:2012-10-25 06:56:03 【问题描述】:QtWebKit
中,有没有办法控制每个HTTP请求的超时时间?例如,如果我为每个 HTTP 请求设置 3 秒,并且在 3 秒后如果请求未完成,则请求中止,其他请求将开始。
我检查了QNetworkAccessManager
API 参考,但找不到合适的解决方案。
【问题讨论】:
我不确定在这种情况下“消费”是什么意思。是否要设置自定义超时值,以便在特定时间后中止请求? @Avaris 是的。对不起我的英语不好。如果我在一定时间后没有收到回复,我想中止 http 请求。 【参考方案1】:没有自定义超时的内置方法。有一个bug report 已开放多年。解决此问题的一种方法是使用您的请求启动自定义QTimer
,并将timeout
信号连接到回复的abort
方法。
一个简单的例子:
import sys
from PyQt4 import QtGui, QtCore, QtNetwork
class Window(QtGui.QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.output = QtGui.QPlainTextEdit()
# google won't respond to port 81, so it's a way to get timeout
self.url = QtGui.QLineEdit('http://www.google.com:81')
self.button = QtGui.QPushButton('Get')
self.button.clicked.connect(self.getPage)
navigateLayout = QtGui.QHBoxLayout()
navigateLayout.addWidget(self.url)
navigateLayout.addWidget(self.button)
layout = QtGui.QVBoxLayout()
layout.addLayout(navigateLayout)
layout.addWidget(self.output)
self.setLayout(layout)
self.manager = QtNetwork.QNetworkAccessManager(self)
# slot to process finished requests
self.manager.finished.connect(self.finished)
self.timeoutTimer = QtCore.QTimer()
# it only needs to fire once
self.timeoutTimer.setSingleShot(True)
# just to see that we aborted
self.timeoutTimer.timeout.connect(self.aborted)
def getPage(self):
url = QtCore.QUrl(self.url.text())
# request that page
# `reply` will be the QNetworkReply we'll get our data
reply = self.manager.get(QtNetwork.QNetworkRequest(url))
# set our timeout to abort request
self.timeoutTimer.timeout.connect(reply.abort)
# start timer (3000ms = 3s)
self.timeoutTimer.start(3000)
def finished(self, reply):
# everything went smoothly and we got our reply before timeout
# no need to abort now. so stop the timer
self.timeoutTimer.stop()
# do something interesting with the result
status = reply.attribute(QtNetwork.QNetworkRequest.HttpStatusCodeAttribute).toString()
self.output.appendPlainText('finished (status code %s)' % status)
def aborted(self):
# timed out :(
self.output.appendPlainText('aborted')
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
【讨论】:
是否有机会做同样的事情,但使用 QWebPage?我的意思是我想要页面到主窗口中的 mainFrame().load(request) 。这个 QNAM 中止注入在那里将是完美的。我有一个问题,它卡在某些图像/文件加载上。永远卡住..以上是关于QtWebKit:控制每个http请求可以消耗的时间的主要内容,如果未能解决你的问题,请参考以下文章