Alihkan pengaturan proxy QGIS secara terprogram

8

Saya menggunakan QGIS di dua kantor dengan server proxy yang berbeda.

Saat ini saya harus mengubah pengaturan proxy secara manual setiap kali saya berganti kantor.

Saya bertanya-tanya apakah mungkin untuk mengubah pengaturan proxy secara terprogram dengan PyQGIS? maka saya bisa menulis plugin untuk beralih di antara pengaturan-proxy.

EDIT1:

Sementara itu saya menemukan cara untuk mengubah pengaturan proxy QGIS tetapi tetap saja tidak berfungsi.

Dengan kode ini saya dapat mengubah pengaturan:

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)

Ini berfungsi sejauh saya bisa melihat pengaturan yang diubah di QGIS UI (pengaturan-> opsi).

Pengaturan juga ditulis ke registri windows tetapi perubahan tidak akan berpengaruh sampai saya klik tombol OK di dialog pengaturan QGIS.

Anda dapat menguji ini dengan mengatur proksi secara programatik ke beberapa proksi-pengaturan yang seharusnya mencegah QGIS mengakses internet (misalnya localhost: 98765) dan mencoba memuat dan menggeser melalui lapisan wms. Ada yang tahu apa yang hilang?

Edit2: Saya baru saja memipipkan output dari qgis ke file dan melihat apa yang terjadi ketika saya mengubah pengaturan proxy menggunakan 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

Jadi ada dua fungsi yang disebut (setupDefaultProxyAndCache dan setFallbackProxyAndExcludes). Mungkin sesuatu seperti itu harus dilakukan ketika menggunakan pyQGIS untuk mengubah pengaturan?

markgraeflerland
sumber
Mungkin posting ini mungkin membantu: Mengatur parameter proxy di plugin qgis. Bagaimana
Joseph
Saya pikir solusi ini hanya berfungsi untuk permintaan yang dilakukan oleh plugin tertentu tetapi tidak sebagai pengaturan proxy umum untuk QGIS. Saya memerlukan pengaturan proxy untuk mendapatkan lapisan WMS saya
markgraeflerland

Jawaban:

3

Mengubah kunci-kunci ini mengubah pengaturan di GUI dan Windows Registry QGIS 2.14 Essen menggunakan kode Anda di atas di Python Console:

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

Dan pada akhirnya tambahkan:

QSettings.sync()
GeospatialPython.com
sumber
Saya baru saja mencoba memanggil QSettings (). Sync () di akhir kode saya tetapi masih sama. hanya jika saya membuka pengaturan dan mengklik tombol OK perubahan diterapkan.
markgraeflerland
Saya dapat mengubah pengaturan di GUI dan registri tetapi pengaturan masih tidak memiliki efek sampai saya menekan tombol OK di dialog pengaturan
markgraeflerland
2

Masalah terpecahkan. QgsNetworkAccessManager harus disetel ke nilai baru :

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
sumber