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?


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()

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.