ProxyError ta' Requests fuq API privata? Iċċekkja l-ambjent l-ewwel
Requests jgħaqqad is-settings tal-proxy, awtentikazzjoni u CA mill-ambjent. Aqra x'jara l-proċess, eskludi l-host privat u żomm il-verifika TLS mixgħula.
Il-VPN huwa mixgħul, id-dashboard intern jinfetaħ fil-browser, u l-iskript Python xorta jtella' żball tal-proxy. F'dik l-istampa m'hemm xejn ħażin fil-mina: l-interpreter jaqra indirizz tal-proxy mill-ambjent tiegħu stess u jibgħat it-talba hemmhekk. Dan il-gwida jaqra l-ambjent li l-proċess verament jara, japplika l-aktar esklużjoni dejqa u biss wara jikkunsidra politika ta' sessjoni espliċita. Kull pass jispiċċa b'kmand li l-output tiegħu jiddeċiedi jekk tkomplix.
Aqra l-ambjent li l-proċess verament jara
Is-settings tal-proxy tad-desktop, l-esportazzjonijiet tal-shell u l-linji Environment= ta' unità systemd huma tliet sorsi differenti, u Requests jaqra biss l-aħħar wieħed li jiret. Mexxi d-dijanjostika t'hawn taħt fl-istess shell, container jew unità li tmexxi l-iskript li qed ifalli, mhux fit-terminal interattiv tiegħek. Varjabbli esportata fis-shell tal-login tiegħek hija inviżibbli għal proċess tal-container, u dak il-vojt jispjega ħafna rapporti dwar proxy li jidher minn xejn. Iż-żewġ kmandi jistampaw l-istess data fuq livelli ta' dettall differenti.
env | grep -i -E 'proxy|requests_ca_bundle|curl_ca_bundle'
python3 -c "import os;[print(k,'=',v) for k,v in sorted(os.environ.items()) if 'proxy' in k.lower()]"
Iż-żewġ ortografiji ta' kull varjabbli jinqraw, u l-entrati duplikati jiġu applikati fl-ordni li fiha l-proċess irċevihom, għalhekk HTTP_PROXY qadim jista' jegħleb il-valur li għadek kemm esportajt. Il-varjabbli tal-bundle CA jgħoddu hawn ukoll, għax ibiddlu fiex verify jiġi riżolt mingħajr ma jidhru imkien fil-kodiċi. Jekk l-output huwa vojt, l-ambjent mhuwiex il-problema tiegħek u tista' tieqaf taqra din it-taqsima. Jekk jelenka proxy li ma tagħrafx, sib il-fajl jew l-unità li jistabbilixxih qabel ma tbiddel xejn.
Staqsi lil Requests x'jagħmel ma' URL speċifiku. Dan is-sejħa turi l-valuri magħquda tal-proxy, verify u cert għal dik it-talba mingħajr ma tibgħat pakkett.
python3 -c "import requests;s=requests.Session();print(s.merge_environment_settings('https://api.corp.example/status',{},None,None,None))"
Entrata proxies mhux vojta għall-host privat hija t-tweġiba tiegħek, u l-valur verify stampat jgħidlek liema bundle CA t-talba kienet tafda. Jekk it-tnejn jidhru korretti, il-falliment huwa aktar tard fil-munzell u għandek taqbeż għat-taqsima tal-verifika. Tassumi xejn mill-kodiċi: il-għaqda sseħħ għal kull talba, u għalhekk sessjoni waħda tista' tġib ruħha b'mod differenti għal żewġ hosts.
Eskludi l-host privat qabel ma tiddiżattiva xejn
Meta l-proxy huwa verament meħtieġ għal destinazzjonijiet oħra, l-aktar soluzzjoni dejqa hija esklużjoni għal dan il-host. Żid mal-lista eżistenti minflok ma tissostitwixxiha, għax it-tħassir ta' NO_PROXY ikisser kull destinazzjoni interna oħra li kienet tiddependi fuqha. Il-kmandi t'hawn taħt iżidu l-entrata u mbagħad jistaqsu lil Requests jekk il-bypass japplikax.
export NO_PROXY="${NO_PROXY:+$NO_PROXY,}api.corp.example,.corp.example"
python3 -c "import requests;print(requests.utils.should_bypass_proxies('https://api.corp.example/status',None))"
It-tqabbil isir bis-suffiss tal-host, għalhekk .corp.example ikopri d-dominju kollu filwaqt li api.corp.example ikopri isem wieħed. Asterisk vojt jiddiżattiva l-proxy għal kull host u kważi qatt mhuwa dak li jrid xogħol tal-produzzjoni. Jekk entrata CIDR tiġix rispettata jiddependi mill-verżjonijiet ta' Requests u urllib3 fl-immaġni, għalhekk ipprova l-entrata eżatta minflok ma tassumi li taħdem. Iċċekkja r-riżultat ta' should_bypass_proxies għall-URL vera, mhux għal isem tal-host li ttrattajt mill-memorja.
Żomm iż-żewġ saffi separati f'moħħok. L-evitar tal-proxy HTTP ma jevitax il-VPN, għax id-deċiżjoni dwar il-proxy sseħħ fil-librerija u d-deċiżjoni dwar il-mina fit-tabella tar-routing tal-kernel.
Iddiżattiva trust_env biss bħala politika ta' sessjoni deliberata
Jekk ix-xogħol kollu għandu jinjora l-konfigurazzjoni tal-ambjent, ibni s-sessjoni b'mod espliċitu u rreġistra d-deċiżjoni fil-kodiċi. Din hija politika, mhux soluzzjoni provviżorja, u tappartjeni għal diff li jarah reviżur. L-eżempju t'hawn taħt iżomm timeout, mogħdija CA espliċita u verifika tal-istat.
import requests
with requests.Session() as session:
session.trust_env = False
response = session.get(
"https://api.corp.example/status",
timeout=(5, 20),
verify="/etc/ssl/certs/corp-ca.pem",
)
response.raise_for_status()
L-iddiżattivar ta' trust_env ibiddel tliet imġibiet f'daqqa, u wieħed biss minnhom huwa dwar il-proxies. Requests jieqaf jaqra l-kredenzjali ta' .netrc, u l-varjabbli REQUESTS_CA_BUNDLE u CURL_CA_BUNDLE jieqfu jaffettwaw verify, li mbagħad jaqa' lura għall-maħżen tas-sertifikati inkluż. Jekk l-organizzazzjoni tiegħek ttemm TLS b'CA tagħha stess, dak il-waqgħa tqajjem żball ta' verifika li jidher mhux relatat mal-bidla li għadek kemm għamilt. L-għoti espliċitu ta' verify huwa dak li jżomm iż-żewġ effetti separati.
Dak li m'għandekx tagħmel huwa li tistabbilixxi verify=False biex tiskot l-iżball li jirriżulta. Dan ibiddel konfigurazzjoni ħażina tal-proxy ma' konnessjoni mhux verifikata, u jaħbi l-problema tas-sertifikat li l-esklużjoni kellha tikxef.
Ivverifika s-saff li qed ifalli u żomm rollback
Tliet fallimenti jidhru l-istess f'log u m'għandhom xejn komuni: proxy li ma jilħaqx id-destinazzjoni jtella' ProxyError jew jirritorna 502, problema ta' fiduċja ttella' SSLError, u rifjut tal-applikazzjoni jirritorna 401 jew 403. Irriproduċi t-talba barra minn Requests biex tara liema għandek. Il-kmandi t'hawn taħt ineħħu l-proxy, jittestjaw il-katina tas-sertifikati u mbagħad jirrepetu s-sejħa permezz tal-librerija.
curl -sv --noproxy '*' https://api.corp.example/status -o /dev/null
openssl s_client -connect api.corp.example:443 -servername api.corp.example </dev/null
python3 -c "import requests;r=requests.get('https://api.corp.example/status',timeout=10);print(r.status_code)"
Jekk is-sejħa curl tirnexxi u s-sejħa Python tfalli, l-ambjent għadu d-differenza. Jekk it-tnejn ifallu fl-istadju TLS, il-proxy qatt ma kien il-problema u l-katina tas-sertifikati hija. Jekk it-tnejn jirritornaw 401, it-talba waslet għall-applikazzjoni u x-xogħol li jifdal huwa l-awtentikazzjoni. Li tirreġistra liema mit-tlieta osservajt tfaddal siegħa lill-persuna li jmiss.
Ir-rollback huwa linja waħda fiż-żewġ direzzjonijiet: neħħi l-esklużjoni, jew aqleb trust_env lura. Issejvja l-valur preċedenti ta' NO_PROXY qabel iżżid miegħu, u ppreferi skript wrapper jew entrata Environment= fil-livell tal-unità minflok esportazzjoni li tgħix biss fl-istorja tat-terminal tiegħek. Iż-żewġ bidliet huma viżibbli fl-ambjent tal-proċess, għalhekk restart normalment iġibek lura għall-imġiba l-qadima.
Ippreżenta billi tikkonferma erba' affarijiet: is-settings magħquda għall-URL privat ma jurux proxy, is-sertifikat jiġi validat kontra l-CA maħsub, it-talba tirritorna l-istat li tistenna, u l-bidla hija kkommessa f'post riproduċibbli. Skript aħdar b'ambjent mhux spjegat huwa tiswija li terġa' tinkisser fil-magna li jmiss. Il-kmandi f'dan il-gwida huma dawk li għandek tippejstja fit-ticket.