Chuyển đổi cài đặt proxy QGIS theo chương trình


8

Tôi đang sử dụng QGIS tại hai văn phòng với các máy chủ proxy khác nhau.

Hiện tại tôi phải thay đổi cài đặt proxy theo cách thủ công mỗi khi tôi chuyển văn phòng.

Tôi đã tự hỏi liệu có thể thay đổi cài đặt proxy theo chương trình với PyQGIS không? sau đó tôi có thể viết một plugin để chuyển giữa các cài đặt proxy.

EDIT1:

Trong thời gian chờ đợi, tôi đã tìm thấy một cách để thay đổi cài đặt proxy của QGIS nhưng nó vẫn không hoạt động.

Với mã này tôi có thể thay đổi cài đặt:

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)

Điều này hoạt động cho đến khi tôi có thể thấy các cài đặt đã thay đổi trong Giao diện người dùng QGIS (cài đặt-> tùy chọn).

Các cài đặt cũng được ghi vào sổ đăng ký windows nhưng những thay đổi sẽ không có hiệu lực cho đến khi tôi nhấp vào nút OK trong hộp thoại cài đặt QGIS.

Bạn có thể kiểm tra điều này bằng cách đặt proxy theo chương trình cho một số cài đặt proxy sẽ ngăn không cho QGIS truy cập internet (ví dụ: localhost: 98765) và thử tải và xoay qua lớp wms. Bất cứ ý tưởng những gì còn thiếu?

Edit2: Tôi vừa chuyển đầu ra từ qgis sang một tệp và xem xét những gì đang xảy ra khi tôi thay đổi cài đặt proxy bằng 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

Vì vậy, có hai hàm được gọi là (setupDefaultProxyAndCache và setFallbackProxyAndExcludes). Có lẽ một cái gì đó như thế phải được thực hiện khi sử dụng pyQGIS để thay đổi cài đặt?


Có lẽ bài đăng này có thể giúp: Đặt tham số proxy trong plugin qgis. Cách làm
Joseph

Tôi nghĩ rằng giải pháp này chỉ hoạt động đối với các yêu cầu được thực hiện bởi một plugin cụ thể chứ không phải là cài đặt proxy chung cho QGIS. Tôi cần cài đặt proxy để tải các lớp WMS của mình
markgraeflerland

Câu trả lời:


3

Việc thay đổi các khóa này đã thay đổi cài đặt trong cả GUI và Windows Registry của QGIS 2.14 Essen bằng mã của bạn ở trên trong Bảng điều khiển Python:

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

Và cuối cùng thêm:

QSettings.sync()

Tôi vừa thử gọi QSinstall (). Sync () ở cuối mã của tôi nhưng vẫn như vậy. chỉ khi tôi mở cài đặt và nhấp vào nút OK, các thay đổi sẽ được áp dụng.
markgraeflerland

Tôi có thể thay đổi cài đặt trong GUI và sổ đăng ký nhưng cài đặt vẫn không có tác dụng gì cho đến khi tôi nhấn nút OK trong hộp thoại cài đặt
markgraeflerland

2

Vấn đề được giải quyết. QssNetworkAccessManager phải được đặt thành các giá trị mới :

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.