2024年5月13日 星期一

Box Python SDK 如何設置 proxy

Box Python SDK 如何設置 proxy



方法0 透過環境環境變數設置

只需要從 python 環境中設置環境變數即可

import os
os.environ['http_proxy'] = 'http://Enterprise.co.jp:8080'
os.environ['https_proxy'] = 'https://Enterprise.co.jp:8080'

我也有嘗試著從環境變數設置過無效,下面舊文是我掙扎的痕跡,可能是我這邊環境問題。

但總之最後測試的結果是,BOXSDK不用改直接追加這幾行在開頭就行了。


如果你從這邊設置無效順著我底下舊文直接改SDK絕對不受環境影響的。








下面是舊文



截止制目前我覺得很扯的是,從源代碼觀察似乎不存在任何參數可以設置 Proxy ,官方可能就沒考慮到這事情

或許有什麼隱藏方法可以設置也說不定,只是我沒能從官方說明上找到,只好自己從原始代碼中下手了

最後被我找到是在 default_network.py 這份檔案中的 Session 負責的,由於看不出來怎麼設置他只好強行修改了
box-python-sdk/boxsdk/network/default_network.py#L26 (github.com)



方法1 動態修改 Boxsdk 類

修改的方式就直接硬上了,在你的程式中使用以下代碼動態修改函式庫
(不是直接修改函式庫代碼別搞錯)

# EnterpriseNetwork (Proxy Setting)
import requests
from boxsdk.network.default_network import DefaultNetwork
from logging import getLogger
def EnterpriseNetwork(self):
    super(DefaultNetwork, self).__init__()
    self._session = requests.Session()
    self._session.proxies.update({
        'http' : 'http://Enterprise.co.jp:8080',
        'https': 'https://Enterprise.co.jp:8080'
    })
    self._logger = getLogger(__name__)
DefaultNetwork.__init__ = EnterpriseNetwork

這樣就能做到動態修改了,覺得很醜但至少應該沒啥副作用,奏合著用吧。




方法2 修改 Boxsdk 類

from os import getenv
class DefaultNetwork(Network):
    def __init__(self):
        super().__init__()
        self._session = requests.Session()
        proxies = {}
        if getenv('http_proxy'):
            proxies['http'] = getenv('http_proxy')
        if getenv('https_proxy'):
            proxies['https'] = getenv('https_proxy')
        if proxies:
            self._session.proxies.update(proxies)
        self._logger = getLogger(__name__)

這個雖然修改了但是是比較折衷的辦法,從環境變數中獲取如果存在的話就加入。

這樣只需要在主程式中動態的定義環境變數,或乾脆定義系統環境變數就可以了。

import os
os.environ['http_proxy'] = 'http://Enterprise.co.jp:8080'
os.environ['https_proxy'] = 'https://Enterprise.co.jp:8080'


最後還有一個發想是,也可以在方法1中使用方法2,把兩個合成起來。



參考

這篇好像疑似有方法,未測試
Box APIとの通信をCharles Proxyを通して覗き見る方法 #BOX - Qiita


沒有留言:

張貼留言