Wechseln Sie die QGIS-Proxy-Einstellungen programmgesteuert

8

Ich verwende QGIS in zwei Büros mit unterschiedlichen Proxyservern.

Im Moment muss ich die Proxy-Einstellungen jedes Mal manuell ändern, wenn ich das Büro wechsle.

Ich habe mich gefragt, ob es möglich ist, die Proxy-Einstellungen mit PyQGIS programmgesteuert zu ändern. dann könnte ich ein Plugin schreiben, um zwischen den Proxy-Einstellungen zu wechseln.

EDIT1:

In der Zwischenzeit habe ich einen Weg gefunden, die Proxy-Einstellungen von QGIS zu ändern, aber es funktioniert immer noch nicht.

Mit diesem Code kann ich die Einstellungen ändern:

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)

Dies funktioniert soweit ich die geänderten Einstellungen in der QGIS-Benutzeroberfläche sehen kann (Einstellungen-> Optionen).

Die Einstellungen werden auch in die Windows-Registrierung geschrieben, aber die Änderungen wirken sich erst aus, wenn ich im QGIS-Einstellungsdialog auf die Schaltfläche OK klicke.

Sie können dies testen, indem Sie den Proxy programmgesteuert auf einige Proxy-Einstellungen einstellen, die verhindern sollen, dass QGIS auf das Internet zugreift (z. B. localhost: 98765), und versuchen, eine wms-Schicht zu laden und zu durchlaufen. Irgendeine Idee, was fehlt?

Edit2: Ich habe gerade die Ausgabe von qgis in eine Datei geleitet und mir angesehen, was passiert, wenn ich die Proxy-Einstellungen über die GUI ändere:

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

Es gibt also zwei Funktionen (setupDefaultProxyAndCache und setFallbackProxyAndExcludes). Vielleicht muss so etwas getan werden, wenn Sie mit pyQGIS die Einstellungen ändern?

markgraeflerland
quelle
Vielleicht könnte dieser Beitrag helfen: Festlegen des Proxy-Parameters in qgis-Plugins. How to
Joseph
Ich denke, dass diese Lösung nur für Anfragen funktioniert, die von einem bestimmten Plugin ausgeführt werden, aber nicht als allgemeine Proxy-Einstellung für QGIS. Ich brauche die Proxy-Einstellungen, um meine WMS-Layer zu laden
markgraeflerland

Antworten:

3

Durch Ändern dieser Schlüssel wurden die Einstellungen sowohl in der GUI als auch in der Windows-Registrierung von QGIS 2.14 Essen mithilfe des obigen Codes in der Python-Konsole geändert:

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

Und am Ende hinzufügen:

QSettings.sync()
GeospatialPython.com
quelle
Ich habe gerade versucht, QSettings (). Sync () am Ende meines Codes aufzurufen, aber immer noch das gleiche. Nur wenn ich die Einstellungen öffne und auf die OK-Schaltfläche klicke, werden die Änderungen übernommen.
Markgraeflerland
Ich kann die Einstellungen in der GUI und der Registrierung ändern, aber die Einstellungen haben immer noch keine Auswirkung, bis ich auf die OK-Schaltfläche im Einstellungsdialog
klicke
2

Problem gelöst. QgsNetworkAccessManager musste auf die neuen Werte gesetzt werden :

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
quelle