Uma requisição pode funcionar por session.get() e falhar na verificação do certificado depois de ser reescrita como PreparedRequest. O caminho send de baixo nível não executa a mesma mesclagem de ambiente do 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)

Faça a mesclagem com a URL preparada final, depois das alterações de URL pretendidas. Decisões de proxy e desvio dependem do destino; configurações obtidas para uma URL anterior podem estar erradas para a requisição realmente enviada.

A configuração de CA é fácil de esquecer

Com a confiança normal no ambiente ativada, a mesclagem considera REQUESTS_CA_BUNDLE e sua alternativa CURL_CA_BUNDLE quando a verificação não foi substituída explicitamente. Chamar send diretamente com verify padrão não faz essa consulta de CA. Desativar a verificação esconde a diferença em vez de fornecer o repositório de certificados pretendido.

Session.prepare_request() também aplica o comportamento de preparação da sessão. Criar uma requisição diretamente com Request.prepare() é outra escolha; não espere que cookies ou outras preparações da sessão sejam aplicados automaticamente.

Proxies têm uma regra mais específica

Seria incorreto dizer que toda PreparedRequest ignora variáveis de ambiente de proxy. No Requests 2.34.2, send resolve os proxies padrão quando o argumento nomeado proxies está ausente. Fornecer proxies={} a send pula aquele ramo específico de resolução.

O dicionário vazio passado a merge_environment_settings tem outro papel: a mesclagem pode preenchê-lo com rotas aplicáveis do ambiente antes de passá-lo a send. Olhar só para o dicionário vazio em dois trechos ignora os métodos diferentes que o recebem.

No código próprio de construção de requisições, mantenha preparação, mesclagem de ambiente e envio juntos. Quando o aplicativo usa trust_env=False de propósito, a mesclagem respeita essa política; não força configurações de ambiente em um cliente que as desativou deliberadamente.

Artigos relacionados