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

Popular posts from this blog

php - Why I am getting the Error "Commands out of sync; you can't run this command now" -

linux - Does gcc have any options to add version info in ELF binary file? -

java - Are there any classes that implement javax.persistence.Parameter<T>? -