Changer les paramètres du proxy QGIS par programmation

8

J'utilise QGIS dans deux bureaux avec des serveurs proxy différents.

Pour le moment, je dois modifier manuellement les paramètres du proxy chaque fois que je change de bureau.

Je me demandais s'il était possible de modifier les paramètres de proxy par programme avec PyQGIS? alors je pourrais écrire un plugin pour basculer entre les paramètres proxy.

EDIT1:

En attendant, j'ai trouvé un moyen de modifier les paramètres de proxy de QGIS mais cela ne fonctionne toujours pas.

Avec ce code, je peux modifier les paramètres:

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)

Cela fonctionne pour autant que je puisse voir les paramètres modifiés dans l'interface utilisateur de QGIS (paramètres-> options).

Les paramètres sont également écrits dans le registre Windows, mais les modifications n'auront aucun effet tant que je n'aurai pas cliqué sur le bouton OK dans la boîte de dialogue des paramètres QGIS.

Vous pouvez tester cela en définissant le proxy par programmation sur certains paramètres de proxy qui devraient empêcher QGIS d'accéder à Internet (par exemple localhost: 98765) et essayez de charger et de parcourir une couche wms. Une idée de ce qui manque?

Edit2: Je viens de canaliser la sortie de qgis vers un fichier et j'ai regardé ce qui se passe lorsque je change les paramètres de proxy en utilisant l'interface graphique:

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

Il existe donc deux fonctions appelées (setupDefaultProxyAndCache et setFallbackProxyAndExcludes). Peut-être que quelque chose comme ça doit être fait lors de l'utilisation de pyQGIS pour modifier les paramètres?

Markgraeflerland
la source
Peut-être que ce message pourrait aider: Définir le paramètre proxy dans les plugins qgis. Comment
Joseph
Je pense que cette solution ne fonctionne que pour les requêtes effectuées par un plugin spécifique mais pas en tant que paramètre de proxy général pour QGIS. J'ai besoin des paramètres de proxy pour charger mes couches WMS
markgraeflerland

Réponses:

3

La modification de ces clés a modifié les paramètres de l'interface graphique et du registre Windows de QGIS 2.14 Essen en utilisant votre code ci-dessus dans la console Python:

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

Et à la fin, ajoutez:

QSettings.sync()
GeospatialPython.com
la source
J'ai juste essayé d'appeler QSettings (). Sync () à la fin de mon code mais toujours le même. ce n'est que si j'ouvre les paramètres et clique sur le bouton OK que les modifications sont appliquées.
markgraeflerland
Je peux changer les paramètres dans l'interface graphique et le registre, mais les paramètres n'ont toujours aucun effet jusqu'à ce que je
clique
2

Problème résolu. QgsNetworkAccessManager a dû être défini sur les nouvelles valeurs :

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
la source