On Mon, Jan 15, 2018 at 6:27 PM, David Marteau <dmart...@3liz.com> wrote:
> Here is a test script that illustrate the problem a bit further: if we run > createProvider() twice, the first time > the getCapbabilities will fail with a timeout. The second time, it will > succeed. > > If you run this script, clear the Qgis network cache between two > invocations. > > ===================8<============================== > import os > import logging > > from qgis.core import QgsApplication, QgsMessageLog > from qgis.core import QgsProject, QgsProviderRegistry > > logger = logging.getLogger() > logger.setLevel(logging.DEBUG) > > # No Display > os.environ['QT_QPA_PLATFORM'] = 'offscreen' > > qgis_application = QgsApplication([], False ) > qgis_application.setPrefixPath('/usr/local', True) > qgis_application.initQgis() > > # Log any messages > def writelogmessage(message, tag, level): > arg = '{}: {}'.format( tag, message ) > if level == QgsMessageLog.WARNING: > logger.warning(arg) > elif level == QgsMessageLog.CRITICAL: > logger.error(arg) > else: > logger.info(arg) > > messageLog = QgsApplication.messageLog() > messageLog.messageReceived.connect( writelogmessage ) > > wmsuri = ("contextualWMSLegend=0&crs=EPSG:4326&dpiMode=7& > featureCount=10&format=image/jpeg" > "&layers=s2cloudless&styles&tileMatrixSet=s2cloudless- > wmsc-14" > "&url=http://tiles.maps.eox.at/wms?" ) > > # GetCapabilities Fail with Request Timeout !!! > provider = QgsProviderRegistry.instance().createProvider( "wms", wmsuri ) > > # Run again => works !!! > provider = QgsProviderRegistry.instance().createProvider( "wms", wmsuri ) > > qgis_application.exitQgis() > del qgis_application > ====================8<============================= > > We have also tested simple QgsNetwork invocation from c++: tests shows > that event loops have the running status, but the > request is not processed at the first invocation. > > David > > > Le 15 janv. 2018 à 15:05, David Marteau <dmart...@3liz.com> a écrit : > > > > > Hi David, > > You need an event loop to use a Q(qg)NetworkAccessManager, it's > asynchronous. > > > Hi Alessandro, > > Yes, we know that (see the second code in previous mail ): the > QgsNetworkAccessManager works perfeclty in python, this is not the point. > > The point is: trying to instanciate a wmsprovider will issue a timeout > when trying to request the capabilities: the code responsible for that > creates its own QEventLoop and manage to do a blocking call (which is > expected here). > Please have a look at https://github.com/qgis/QGIS/blob/master/src/ > providers/wms/qgswmscapabilities.cpp#L1964. What we do not understand is > why, despite the call of loop.exec() in the c++ code, the request is not > processed (my example with the Q(gs)etworkAccessManager > shows that it should processed) > > Actually you cannot instanciate properly a QgsProject with a WMS layer. > > To convince yourself, try to instanciate a QgsProject in python (in a > standalone python script) from a .qgs project having a single wms layer: it > will fail to instanciate the layer. > > Hi David, I verified this issue, I'm sorry but I don't have an explanation right away and it looks like a bug, please file a ticket. -- Alessandro Pasotti w3: www.itopen.it
_______________________________________________ QGIS-Developer mailing list QGIS-Developer@lists.osgeo.org List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer