編集:
私はあなたの便宜のためにこのSSCCEを準備しました: (実行するだけです)
from PyQt4 import QtCore, QtGui, QtNetwork
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
import time
import sys
import json
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
class SSCCE(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(800, 578)
QMetaObject.connectSlotsByName(MainWindow)
def main(self):
request = QNetworkRequest()
request.setUrl(QUrl("http://search.twitter.com/search.json?q=blue&rpp=1"))
self.network_manager = QNetworkAccessManager()
self.network_manager.finished.connect(self._request_finished)
self.network_manager.post(request, self.urlencode_post({'a' : 'b'}))
def urlencode_post(self, data):
post_params = QUrl()
for (key, value) in data.items():
post_params.addQueryItem(key, unicode(value))
return post_params.encodedQuery()
def func2(self):
request = QNetworkRequest()
request.setUrl(QUrl("http://search.twitter.com/search.json?q=red&rpp=1"))
request.setRawHeader('content-Type', 'application/x-www-form-urlencoded;charset=UTF-8')
self.network_manager.finished.connect(self.func3)
self.network_manager.get(request)
def func3(self, reply):
if not reply.error() == QNetworkReply.NoError:
# request probably failed
print(reply.error())
print(reply.errorString())
else:
reply.close()
def func1(self, reply):
ans = reply.readAll()
print(ans)
time.sleep(5)
print("""\n
IT PRINTS THEM BOTH:
===================
%s
"""%ans)
self.func2()
def _request_finished(self, reply):
if not reply.error() == QNetworkReply.NoError:
# request probably failed
print(reply.error())
print(reply.errorString())
else:
reply.close()
self.func1(reply)
app = QApplication(sys.argv)
MainWindow = QMainWindow()
ui = SSCCE()
ui.setupUi(MainWindow)
ui.main()
MainWindow.show()
sys.exit(app.exec_())
元の質問:
マイコード: (関連部分)
def update(self):
request = QNetworkRequest()
request.setUrl(QUrl("someurl"))
self.network_manager.finished.connect(self._update)
self.network_manager.get(request)
def _update(self, reply): # update stage 2
if not reply.error() == QNetworkReply.NoError:
# request probably failed
print(reply.error())
print(reply.errorString())
print("retrying")
self.update()
else:
reply.abort()
#print(str(reply.readAll().data()))
data = json.loads(str(reply.readAll().data())) # get data
#work with the data (irrelevant)
def sendBearer_req(self):
request = QNetworkRequest()
request.setUrl(QUrl("someotherurl"))
self.network_manager = QNetworkAccessManager()
self.network_manager.finished.connect(self._request_finished)
self.network_manager.post(request, self.urlencode_post({'some' : 'thing'}))
def sendBearer(self, reply):
reply.abort()
ans = reply.readAll()
print(ans)
time.sleep(5)
print(ans)
try:
self.bearer = json.loads(str(ans))
self.update()
except:
raise #for debugging
self.sendBearer_req() #retry
def _request_finished(self, reply):
if not reply.error() == QNetworkReply.NoError:
# request probably failed
print(reply.error())
print(reply.errorString())
print("retrying")
self.sendBearer_req()
else:
self.sendBearer(reply)
問題:
この部分で:
reply.abort()
ans = reply.readAll()
print(ans)
time.sleep(5)
print(ans)
abort
最初は必要なものだけを出力するため、機能していないと確信してprint
いますが、待っている間、明らかにコードを続行し、update
別のリクエストを送信する関数に入ります。そのため、2 番目print
の応答では 2 つの応答が混ざり合い、両方が出力されます。
(ところで私も試しclose
ました-同じ結果)
私は何を間違っていますか?