Requests PreparedRequest ও অনুপস্থিত পরিবেশ সেটিং
প্রতিটি নিম্নস্তরের send প্রক্সি উপেক্ষা করে ধরে না নিয়ে নিজস্ব প্রস্তুত অনুরোধকে Requests-এর সাধারণ প্রক্সি ও CA ব্যবস্থার সঙ্গে মিলিয়ে রাখুন।
অনুরোধ session.get() দিয়ে চলেও PreparedRequest হিসেবে নতুন করে লেখার পরে সার্টিফিকেট যাচাইয়ে ব্যর্থ হতে পারে। নিম্নস্তরের send পথ সাধারণ request পদ্ধতির মতো পরিবেশ মার্জ করে না।
import requests
with requests.Session() as session:
request = requests.Request("GET", "https://example.com/")
prepared = session.prepare_request(request)
settings = session.merge_environment_settings(
prepared.url, {}, None, None, None
)
response = session.send(
prepared,
timeout=(5, 15),
**settings,
)
response.raise_for_status()
print(response.status_code)
কাঙ্ক্ষিত URL পরিবর্তনের পরে চূড়ান্ত প্রস্তুত URL দিয়ে মার্জ করুন। প্রক্সি ও বাইপাস সিদ্ধান্ত গন্তব্যনির্ভর, তাই পুরোনো URL-এর সেটিং আসল পাঠানো অনুরোধে ভুল হতে পারে।
CA সেটিং সহজে বাদ পড়ে
সাধারণ পরিবেশ-আস্থা চালু থাকলে এবং যাচাই স্পষ্টভাবে বদলে না দিলে মার্জ REQUESTS_CA_BUNDLE ও তার বিকল্প CURL_CA_BUNDLE বিবেচনা করে। ডিফল্ট verify দিয়ে সরাসরি send এই CA খোঁজ করে না। যাচাই বন্ধ করা নির্ধারিত সার্টিফিকেট ভান্ডার দেওয়ার বদলে পার্থক্য লুকায়।
Session.prepare_request() সেশনের প্রস্তুতির আচরণও প্রয়োগ করে। সরাসরি Request.prepare() দিয়ে অনুরোধ বানানো আলাদা পছন্দ; সেশন কুকি বা অন্য সেশন প্রস্তুতি আপনা থেকে হবে আশা করবেন না।
প্রক্সির আরও নির্দিষ্ট নিয়ম আছে
প্রতিটি PreparedRequest প্রক্সি পরিবেশ চলক উপেক্ষা করে বলা ভুল। Requests 2.34.2-এ proxies নামযুক্ত আর্গুমেন্ট না থাকলে send ডিফল্ট প্রক্সি নির্ধারণ করে। send-এ proxies={} দিলে সেই নির্দিষ্ট ডিফল্ট নির্ধারণের শাখা এড়ায়।
merge_environment_settings-এ দেওয়া খালি ডিকশনারির ভূমিকা আলাদা: send-এ যাওয়ার আগে মার্জ সেটিকে প্রযোজ্য পরিবেশ পথ দিয়ে পূরণ করতে পারে। দুই কোডে শুধু খালি ডিকশনারি দেখলে তা গ্রহণকারী আলাদা পদ্ধতি চোখ এড়ায়।
নিজস্ব অনুরোধ তৈরির কোডে প্রস্তুতি, পরিবেশ মার্জ ও পাঠানো একসঙ্গে রাখুন। অ্যাপ ইচ্ছা করে trust_env=False ব্যবহার করলে মার্জ সেই নীতি মানে; পরিবেশ সচেতনভাবে বন্ধ করা ক্লায়েন্টে সেটিং জোর করে ঢোকায় না।