Requests PreparedRequest وإعدادات البيئة المفقودة
اجعل الطلبات المحضّرة المخصصة متسقة مع معالجة Requests العادية للوكيل وCA، دون افتراض أن كل send منخفض المستوى يتجاهل الوكلاء.
قد يعمل الطلب عبر 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 النهائي المحضّر، بعد أي تغييرات مقصودة فيه. تعتمد قرارات الوكيل والتجاوز على الوجهة، لذلك قد لا تلائم إعدادات جُمعت لعنوان سابق الطلب الذي ترسله فعلًا.
يسهل إغفال إعداد CA
عند تفعيل الثقة العادية بالبيئة، يأخذ الدمج REQUESTS_CA_BUNDLE وبديله CURL_CA_BUNDLE في الحسبان إذا لم يُتجاوز التحقق صراحةً. استدعاء send مباشرة بإعداد verify الافتراضي لا يجري بحث CA هذا. تعطيل التحقق يخفي الاختلاف بدل توفير مخزن الشهادات المقصود.
يطبّق Session.prepare_request() أيضًا سلوك التحضير الخاص بالجلسة. إنشاء الطلب مباشرة باستخدام Request.prepare() خيار منفصل؛ لا تتوقّع تطبيق ملفات ارتباط الجلسة أو تحضيراتها الأخرى تلقائيًا.
للـوكلاء قاعدة أدق
ليس دقيقًا القول إن كل PreparedRequest يتجاهل متغيرات بيئة الوكيل. في Requests 2.34.2، يحلّ send القيم الافتراضية للوكيل عندما تغيب وسيطة proxies المسماة. تمرير proxies={} إلى send يتخطّى فرع الحل الافتراضي المحدّد هذا.
للقاموس الفارغ الممرّر إلى merge_environment_settings دور مختلف: يمكن للدمج ملؤه بمسارات البيئة المناسبة قبل تمريره إلى send. النظر فقط إلى وجود قاموس فارغ في مقتطفين يفوّت اختلاف الطريقتين اللتين تتلقّيانه.
في كود بناء الطلبات المخصص، أبقِ التحضير ودمج البيئة والإرسال معًا. عندما يستخدم التطبيق trust_env=False عمدًا، يحترم الدمج هذه السياسة؛ لا يفرض إعدادات البيئة على عميل عطّلها عن قصد.