Cambiar la configuración del proxy QGIS mediante programación

8

Estoy usando QGIS en dos oficinas con diferentes servidores proxy.

Por el momento, tengo que cambiar la configuración del proxy manualmente cada vez que cambio la oficina.

Me preguntaba si es posible cambiar la configuración del proxy mediante programación con PyQGIS. entonces podría escribir un complemento para cambiar entre la configuración del proxy.

EDITAR1:

Mientras tanto, encontré una manera de cambiar la configuración de proxy de QGIS pero aún no funciona.

Con este código puedo cambiar la configuración:

from PyQt4.QtCore import QUrl, QSettings
from PyQt4.QtNetwork import QNetworkRequest, QNetworkProxy
from qgis.core import QgsNetworkAccessManager

my_settings={"Proxy enabled": u'proxy/proxyEnabled', "Proxy Host ": u'proxy/proxyHost', "Proxy Port": u'proxy/proxyPort'}
fiddler={"Proxy enabled": True, "Proxy Host ": "localhost", "Proxy Port": 8888}
freiburg={"Proxy enabled": True, "Proxy Host ": "192.168.95.165", "Proxy Port": 8080}
aus={"Proxy enabled": False, "Proxy Host ": "192.168.95.165", "Proxy Port": 8080}

current_choice=aus

s = QSettings() #getting proxy from qgis options settings

for key, val in my_settings.iteritems():
    #print str(key)+":"+str(val)
    settings_key=key
    #print str(settings_key)
    # Get user defined current setting
    for key2, val2 in current_choice.iteritems():
        if key2==settings_key:
            #print key
            #print val
            settings_val=val2
    current_setting = s.value(str(val).decode('unicode-escape'))
    #print str(val).decode('unicode-escape')
    #print str(key)+": "+str(current_setting)
    s.setValue(unicode(str(val)), settings_val)
s.sync()

# procedure to set proxy if needed

proxyEnabled = s.value("proxy/proxyEnabled", "")
proxyType = s.value("proxy/proxyType", "" )
proxyHost = s.value("proxy/proxyHost", "" )
proxyPort = s.value("proxy/proxyPort", "" )
proxyUser = s.value("proxy/proxyUser", "" )
proxyPassword = s.value("proxy/proxyPassword", "" )
if proxyEnabled == "true": # test if there are proxy settings
   proxy = QNetworkProxy()
   if proxyType == "DefaultProxy":
       proxy.setType(QNetworkProxy.DefaultProxy)
   elif proxyType == "Socks5Proxy":
       proxy.setType(QNetworkProxy.Socks5Proxy)
   elif proxyType == "HttpProxy":
       proxy.setType(QNetworkProxy.HttpProxy)
   elif proxyType == "HttpCachingProxy":
       proxy.setType(QNetworkProxy.HttpCachingProxy)
   elif proxyType == "FtpCachingProxy":
       proxy.setType(QNetworkProxy.FtpCachingProxy)
   proxy.setHostName(proxyHost)
   proxy.setPort(int(proxyPort))
   proxy.setUser(proxyUser)
   proxy.setPassword(proxyPassword)
   QNetworkProxy.setApplicationProxy(proxy)

Esto funciona hasta donde puedo ver la configuración modificada en la interfaz de usuario de QGIS (configuración-> opciones).

La configuración también se escribe en el registro de Windows, pero los cambios no tendrán ningún efecto hasta que haga clic en el botón Aceptar en el cuadro de diálogo de configuración de QGIS.

Puede probar esto configurando el proxy mediante programación a algunas configuraciones de proxy que deberían evitar que QGIS acceda a Internet (por ejemplo, localhost: 98765) e intente cargar y desplazarse a través de una capa wms. ¿Alguna idea de lo que falta?

Edit2: acabo de canalizar la salida de qgis a un archivo y eché un vistazo a lo que está sucediendo cuando cambio la configuración del proxy usando la GUI:

src/core/qgsnetworkaccessmanager.cpp: 364: (setupDefaultProxyAndCache) [9134ms] setting proxy 3 192.168.95.165:8080 /
src/core/qgsnetworkaccessmanager.cpp: 167: (setFallbackProxyAndExcludes) [0ms] proxy settings: (type:HttpProxy host: 192.168.95.165:8080, user:, password:not set

Entonces, hay dos funciones llamadas (setupDefaultProxyAndCache y setFallbackProxyAndExcludes). ¿Quizás deba hacerse algo así al usar pyQGIS para cambiar la configuración?

Markgraeflerland
fuente
Quizás esta publicación pueda ayudar: configurar el parámetro proxy en los complementos qgis. Cómo
Joseph
Creo que esta solución solo funciona para solicitudes realizadas por un complemento específico, pero no como una configuración de proxy general para QGIS. Necesito la configuración del proxy para cargar mis capas WMS
markgraeflerland

Respuestas:

3

El cambio de estas teclas cambió la configuración tanto en la GUI como en el Registro de Windows de QGIS 2.14 Essen usando su código anterior en la Consola Python:

u'proxy/proxyEnabled', u'proxy/proxyExcludedUrls', u'proxy/proxyHost', u'proxy/proxyPassword', u'proxy/proxyPort', u'proxy/proxyType', u'proxy/proxyUser'

Y al final agregue:

QSettings.sync()
GeospatialPython.com
fuente
Acabo de intentar llamar a QSettings (). Sync () al final de mi código pero sigue siendo el mismo. solo si abro la configuración y hago clic en el botón Aceptar, se aplican los cambios.
markgraeflerland
Puedo cambiar la configuración en la GUI y el registro, pero la configuración aún no tiene ningún efecto hasta que
presione el
2

Problema resuelto. QgsNetworkAccessManager tuvo que establecerse en los nuevos valores :

from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtNetwork import QNetworkRequest, QNetworkProxy

my_settings={"Proxy enabled": u'proxy/proxyEnabled', "Proxy Host ": u'proxy/proxyHost', "Proxy Port": u'proxy/proxyPort'}
fiddler={"Proxy enabled": True, "Proxy Host ": "localhost", "Proxy Port": 8888}
freiburg={"Proxy enabled": True, "Proxy Host ": "192.168.95.165", "Proxy Port": 8080}
aus={"Proxy enabled": False, "Proxy Host ": "192.168.95.165", "Proxy Port": 8080}

current_choice=aus

s = QSettings() #getting proxy from qgis options settings

for key, val in my_settings.iteritems():
    settings_key=key
    for key2, val2 in current_choice.iteritems():
        if key2==settings_key:
            settings_val=val2
    current_setting = s.value(str(val).decode('unicode-escape'))
    s.setValue(unicode(str(val)), settings_val)
s.sync()

proxyEnabled = s.value("proxy/proxyEnabled", "")
proxyType = s.value("proxy/proxyType", "" )
proxyHost = s.value("proxy/proxyHost", "" )
proxyPort = s.value("proxy/proxyPort", "" )
proxyUser = s.value("proxy/proxyUser", "" )
proxyPassword = s.value("proxy/proxyPassword", "" )
proxy = QNetworkProxy()
#setting HttpPtoxy
proxy.setType(QNetworkProxy.HttpProxy)

proxy.setHostName(proxyHost)
proxy.setPort(int(proxyPort))
proxy.setUser(proxyUser)
proxy.setPassword(proxyPassword)
QNetworkProxy.setApplicationProxy(proxy)
network_manager=QgsNetworkAccessManager.instance()
stringlist= ""
network_manager.setupDefaultProxyAndCache ()
network_manager.setFallbackProxyAndExcludes(proxy, stringlist)
Markgraeflerland
fuente