Alterne as configurações de proxy QGIS programaticamente

8

Estou usando o QGIS em dois escritórios com servidores proxy diferentes.

No momento, tenho que alterar as configurações de proxy manualmente sempre que mudar de escritório.

Eu queria saber se é possível alterar as configurações de proxy programaticamente com PyQGIS? então eu poderia escrever um plugin para alternar entre as configurações de proxy.

EDIT1:

Enquanto isso, eu encontrei uma maneira de alterar as configurações de proxy do QGIS, mas ainda não está funcionando.

Com este código, posso alterar as configurações:

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)

Isso funciona até onde posso ver as configurações alteradas na interface do QGIS (configurações-> opções).

As configurações também são gravadas no registro do Windows, mas as alterações não terão efeito até eu clicar no botão OK na caixa de diálogo de configurações do QGIS.

Você pode testar isso configurando o proxy de forma programática para algumas configurações de proxy que devem impedir o QGIS de acessar a Internet (por exemplo, localhost: 98765) e tentar carregar e percorrer uma camada de wms. Alguma idéia do que está faltando?

Edit2: Acabei de canalizar a saída do qgis para um arquivo e dei uma olhada no que está acontecendo quando altero as configurações de proxy usando a 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

Portanto, existem duas funções chamadas (setupDefaultProxyAndCache e setFallbackProxyAndExcludes). Talvez algo assim deva ser feito ao usar o pyQGIS para alterar as configurações?

markgraeflerland
fonte
Talvez este post possa ajudar: Configurando o parâmetro proxy nos plugins qgis. Como fazer
Joseph
Eu acho que essa solução funciona apenas para solicitações feitas por um plug-in específico, mas não como uma configuração geral de proxy para o QGIS. Eu preciso as configurações de proxy para obter os meus WMS-camadas carregado
Markgraeflerland

Respostas:

3

A alteração dessas chaves alterou as configurações na GUI e no Registro do Windows do QGIS 2.14 Essen usando o código acima no Console Python:

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

E no final adicione:

QSettings.sync()
GeospatialPython.com
fonte
Eu apenas tentei chamar QSettings (). Sync () no final do meu código, mas ainda assim. somente se eu abrir as configurações e clicar no botão OK, as alterações serão aplicadas.
Markgraeflerland
Eu posso mudar as configurações da GUI e do registro, mas as definições ainda não têm qualquer efeito até que eu bati o botão OK na caixa de diálogo Configurações
Markgraeflerland
2

Problema resolvido. QgsNetworkAccessManager teve que ser definido com os novos 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
fonte