python - QNetworkReply doesn't abort/close -
edit:
i've prepared sscce convenience: (just run it)
from pyqt4 import qtcore, qtgui, qtnetwork pyqt4.qtcore import * pyqt4.qtgui import * 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() (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 failed print(reply.error()) print(reply.errorstring()) else: reply.close() def func1(self, reply): ans = reply.readall() print(ans) time.sleep(5) print("""\n prints them both: =================== %s """%ans) self.func2() def _request_finished(self, reply): if not reply.error() == qnetworkreply.noerror: # request 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_()) original question:
my code: (relevent parts)
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 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())) # data #work 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 failed print(reply.error()) print(reply.errorstring()) print("retrying") self.sendbearer_req() else: self.sendbearer(reply) problem:
in part:
reply.abort() ans = reply.readall() print(ans) time.sleep(5) print(ans) i'm pretty sure abort isn't working because on first print prints want then, while waits, apparently continues code , enters update function sends request. therefor in second print 2 replies mix , prints both.
(btw tried close - same result)
what doing wrong?
i found problem!
the problem haven't disconnected network manager finished signal former function connected to, therefore causing reply go both functions (new connection , old one)
i solved using .disconnect() command before connecting again:
self.network_manager.finished.disconnect() #this!!! self.network_manager.finished.connect(self._update) and in sscce:
self.network_manager.finished.disconnect() #this!!! self.network_manager.finished.connect(self.func3) hope helped future viewers!
Comments
Post a Comment