Una solicitud puede funcionar con session.get() y fallar en la verificación del certificado tras reescribirla como PreparedRequest. La ruta send de bajo nivel no ejecuta la misma combinación de entorno que el método request normal.

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)

Combina usando la URL preparada final, después de los cambios de URL previstos. Las decisiones de proxy y exclusión dependen del destino, por lo que los ajustes obtenidos para una URL anterior pueden ser incorrectos para la solicitud realmente enviada.

El ajuste CA es fácil de pasar por alto

Con la confianza normal en el entorno activada, la combinación considera REQUESTS_CA_BUNDLE y su alternativa CURL_CA_BUNDLE cuando la verificación no se ha sobrescrito expresamente. Llamar a send directamente con verify predeterminado no hace esa consulta CA. Desactivar la verificación oculta la diferencia en vez de proporcionar el almacén de certificados previsto.

Session.prepare_request() también aplica el comportamiento de preparación de la sesión. Crear una solicitud directamente con Request.prepare() es otra decisión; no esperes que aplique automáticamente cookies de sesión ni otras preparaciones de sesión.

Los proxies tienen una regla más concreta

Sería inexacto afirmar que toda PreparedRequest ignora las variables de entorno proxy. En Requests 2.34.2, send resuelve los valores proxy predeterminados cuando falta el argumento de palabra clave proxies. Pasar proxies={} a send omite esa rama concreta de resolución.

El diccionario vacío pasado a merge_environment_settings cumple otra función: la combinación puede llenarlo con rutas de entorno aplicables antes de enviarlo a send. Mirar solo el diccionario vacío en dos fragmentos oculta los distintos métodos que lo reciben.

En código propio de construcción de solicitudes, mantén juntas la preparación, la combinación de entorno y el envío. Si la aplicación usa trust_env=False deliberadamente, la combinación respeta esa política; no fuerza ajustes de entorno en un cliente que los desactivó expresamente.

Artículos relacionados