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?
Antworten:
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:
Und am Ende hinzufügen:
quelle
Problem gelöst. QgsNetworkAccessManager musste auf die neuen Werte gesetzt werden :
quelle