בקשה יכולה לעבוד דרך 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 אם האימות לא נעקף במפורש. קריאה ישירה ל־send עם verify ברירת מחדל אינה מבצעת חיפוש CA זה. כיבוי האימות מסתיר את ההבדל במקום לספק את מאגר התעודות הרצוי.

Session.prepare_request() מחיל גם את התנהגות ההכנה של ההפעלה. יצירת בקשה ישירות עם Request.prepare() היא בחירה נפרדת; אל תצפו להחלה אוטומטית של עוגיות הפעלה או הכנות הפעלה אחרות.

לפרוקסי יש כלל מדויק יותר

לא מדויק לומר שכל PreparedRequest מתעלם ממשתני סביבת פרוקסי. ב־Requests 2.34.2, ‏send פותר ברירות מחדל של פרוקסי כאשר הארגומנט הנקוב proxies חסר. העברת proxies={} ל־send מדלגת על אותו ענף מסוים של פתרון ברירות המחדל.

למילון הריק שנמסר ל־merge_environment_settings תפקיד שונה: המיזוג יכול למלא אותו בנתיבי סביבה מתאימים לפני העברתו ל־send. הסתכלות רק על מילון ריק בשני קטעים מפספסת את השיטות השונות שמקבלות אותו.

בקוד מותאם לבניית בקשות, השאירו הכנה, מיזוג סביבה ושליחה יחד. כשהיישום משתמש ב־trust_env=False בכוונה, המיזוג מכבד את המדיניות; הוא אינו כופה הגדרות סביבה על לקוח שביטל אותן במודע.

מאמרים קשורים