Жеке APIде Requests ProxyError? Адегенде чөйрөнү текшериңиз
Requests прокси, аутентификация жана CA жөндөөлөрүн чөйрөдөн бириктирет. Процесс эмнени көрөрүн окуңуз, жеке хостту алып салыңыз жана TLS текшерүүсүн күйүк калтырыңыз.
VPN күйүк, ички такта браузерде ачылат, бирок Python скрипти дагы эле прокси катасын берет. Бул көрүнүштө туннелде эч нерсе туура эмес эмес: интерпретатор прокси дарегин өз чөйрөсүнөн окуп, сурамды ошол жакка жөнөтөт. Бул колдонмо процесстин чындап көргөн чөйрөсүн окуйт, эң тар четтетүүнү колдонот жана андан кийин гана ачык сессия саясатын карайт. Ар бир кадам чыгарылышы улантууну чечкен буйрук менен бүтөт.
Процесс чындап көргөн чөйрөнү окуңуз
Жумуш үстөлүнүн прокси жөндөөлөрү, shell экспорттору жана systemd бирдигинин Environment= саптары үч башка булак, жана Requests мураска алган акыркысын гана окуйт. Төмөнкү диагностиканы иштебей калган скрипти иштеткен ошол эле shell, контейнер же бирдикте аткарыңыз, интерактивдүү терминалыңызда эмес. Логин shellиңизде экспорттолгон өзгөрмө контейнер процессине көрүнбөйт, жана бул ажырык эч жерден пайда болгон прокси тууралуу көптөгөн билдирүүлөрдү түшүндүрөт. Эки буйрук бирдей маалыматты ар кандай деталдуулук деңгээлинде басып чыгарат.
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()]"
Ар бир өзгөрмөнүн эки жазылышы тең окулат, ал эми кайталанган жазуулар процесс аларды алган тартипте колдонулат, ошондуктан эскирген HTTP_PROXY жаңы эле экспорттогон маанини басып кетиши мүмкүн. CA буусунун өзгөрмөлөрү бул жерде да маанилүү, анткени алар коддо эч жерде көрүнбөстөн verify эмнеге чечилерин өзгөртөт. Эгер чыгарылыш бош болсо, чөйрө сиздин маселеңиз эмес жана бул бөлүмдү окууну токтотсоңуз болот. Эгер ал сиз билбеген проксини тизмелесе, бир нерсени өзгөртүүдөн мурун аны орноткон файлды же бирдикти табыңыз.
Requestsтен белгилүү бир URL менен эмне кыларын сураңыз. Бул чакыруу пакет жөнөтпөстөн ошол сурам үчүн бириктирилген прокси, verify жана cert маанилерин көрсөтөт.
python3 -c "import requests;s=requests.Session();print(s.merge_environment_settings('https://api.corp.example/status',{},None,None,None))"
Жеке хост үчүн бош эмес proxies жазуусу сиздин жообуңуз, ал эми басылган verify мааниси сурам кайсы CA буусуна ишенээрин айтат. Эгер экөө тең туура көрүнсө, бузулуу стекте кийин жана текшерүү бөлүмүнө өтүү керек. Коддон божомолдобоңуз: бириктирүү ар бир сурам үчүн болот, ошондуктан бир сессия эки хостко башкача жүрүшү мүмкүн.
Бир нерсени өчүрүүдөн мурун жеке хостту четтетиңиз
Прокси башка максаттар үчүн чындап керек болсо, тар чечим — ушул хостту четтетүү. Бардык тизмеге кошуңуз, аны алмаштырбаңыз, анткени NO_PROXY өчүрүү ага таянган башка ар кандай ички максатты бузат. Төмөнкү буйруктар жазууну кошуп, анан Requestsтен айланып өтүүнүн колдонуларын сурайт.
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))"
Дал келүү хост суффикси боюнча, ошондуктан .corp.example бүт доменди камтыйт, ал эми api.corp.example бир атты камтыйт. Жылаңач жылдызча ар бир хост үчүн проксини өчүрөт жана өндүрүштүк жумуш муну сейрек каалайт. CIDR жазуусунун эске алынышы сүрөттөгү Requests жана urllib3 версияларына байланыштуу, ошондуктан иштейт деп божомолдобой, так жазууну текшериңиз. should_bypass_proxies жыйынтыгын чыныгы URL үчүн текшериңиз, эсиңизден терген хост аты үчүн эмес.
Эки катмарды ойдон бөлүп кармаңыз. HTTP проксисин айланып өтүү VPNди айланып өтпөйт, анткени прокси чечими китепканада, ал эми туннелдин чечими ядронун маршруттоо таблицасында кабыл алынат.
trust_envти атайын тандалган сессия саясаты катары гана өчүрүңүз
Эгер бүт жумуш айлана-чөйрөдөгү конфигурацияны этибарга албашы керек болсо, сессияны ачык куруп, чечимди коддо жазып коюңуз. Бул саясат, айланып өтүү эмес, жана рецензент көрө турган diffке таандык. Төмөнкү мисал таймаутты, ачык CA жолун жана статусту текшерүүнү сактайт.
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()
trust_env ти өчүрүү бир эле учурда үч жүрүм-турумду өзгөртөт, алардын бири гана проксиге тиешелүү. Requests .netrc күбөлүктөрүн окууну токтотот, ал эми REQUESTS_CA_BUNDLE жана CURL_CA_BUNDLE өзгөрмөлөрү verify ге таасир этүүнү токтотот, ал андан кийин камтылган сертификат кампасына кайтат. Эгер уюмуңуз TLSти өз CAсы менен бүтүрсө, бул кайтуу жаңы эле жасалган өзгөртүүгө байланышы жок көрүнгөн текшерүү катасын жаратат. verify ти ачык өткөрүп берүү эки таасирди бөлүп турат.
Кылбашыңыз керек нерсе — пайда болгон катаны басуу үчүн verify=False ти орнотуу. Бул проксинин туура эмес конфигурациясын текшерилбеген туташууга алмаштырат жана четтетүү ачышы керек болгон сертификат маселесин жашырат.
Иштебей калган катмарды текшериңиз жана артка кайтаруу мүмкүнчүлүгүн сактаңыз
Үч бузулуу журналда бирдей көрүнөт жана эч нерсеси жалпы эмес: максатка жетпеген прокси ProxyError ыргытат же 502 кайтарат, ишеним маселеси SSLError ыргытат, ал эми колдонмонун баш тартуусу 401 же 403 кайтарат. Кайсынысы экенин көрүү үчүн сурамды Requestsтен тышкары кайталаңыз. Төмөнкү буйруктар проксини алып салат, сертификат тизмегин текшерет, анан чакырууну китепкана аркылуу кайталайт.
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)"
Эгер curl чакыруусу ийгиликтүү болуп, Python чакыруусу ийгиликсиз болсо, айырма дагы эле чөйрөдө. Эгер экөө тең TLS баскычында ийгиликсиз болсо, прокси эч качан маселе болгон эмес жана маселе сертификат тизмегинде. Эгер экөө тең 401 кайтарса, сурам колдонмого жетти жана калган иш — аутентификация. Үчөөнүн кайсынысын байкаганыңызды жазып алуу кийинки адамдын бир саатын үнөмдөйт.
Артка кайтаруу эки багытта тең бир сап: четтетүүнү алып салыңыз же trust_env ти кайтарыңыз. Кошуудан мурун мурунку NO_PROXY маанисин сактаңыз жана терминал тарыхында гана жашаган экспорттун ордуна каптоочу скриптти же бирдик деңгээлиндеги Environment= жазуусун тандаңыз. Эки өзгөртүү тең процесс чөйрөсүндө көрүнөт, ошондуктан кайра иштетүү адатта эски жүрүм-турумга кайтарат.
Төрт нерсени ырастоо менен аяктаңыз: жеке URL үчүн бириктирилген жөндөөлөр проксини көрсөтпөйт, сертификат көздөлгөн CAга каршы текшерилет, сурам күткөн статусуңузду кайтарат жана өзгөртүү кайталануучу жерге commit жасалган. Түшүндүрүлбөгөн чөйрө менен жашыл скрипт — кийинки машинада кайра бузулуучу оңдоо. Бул колдонмодогу буйруктар — билетке коюу керек буйруктар.