Requests PreparedRequest và cài đặt môi trường bị thiếu
Giữ yêu cầu chuẩn bị tùy chỉnh nhất quán với cách Requests thường xử lý proxy và CA, không cho rằng mọi send cấp thấp đều bỏ qua proxy.
Yêu cầu có thể hoạt động qua session.get() nhưng thất bại ở xác minh chứng chỉ sau khi viết lại thành PreparedRequest. Đường send cấp thấp không thực hiện cùng phép hợp nhất môi trường như phương thức request thông thường.
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)
Hợp nhất bằng URL đã chuẩn bị cuối cùng, sau các thay đổi URL mong muốn. Quyết định proxy và bỏ qua phụ thuộc đích, nên cài đặt lấy cho URL trước có thể sai với yêu cầu thực sự gửi đi.
Cài đặt CA dễ bị bỏ sót
Khi tin cậy môi trường thông thường được bật, phép hợp nhất xét REQUESTS_CA_BUNDLE và phương án dự phòng CURL_CA_BUNDLE nếu xác minh chưa bị ghi đè rõ ràng. Gọi send trực tiếp với verify mặc định không làm tra cứu CA đó. Tắt xác minh che giấu khác biệt thay vì cung cấp kho chứng chỉ dự định.
Session.prepare_request() còn áp dụng hành vi chuẩn bị của phiên. Tạo yêu cầu trực tiếp bằng Request.prepare() là lựa chọn riêng; đừng mong cookie phiên hoặc chuẩn bị khác của phiên được áp dụng tự động.
Proxy có quy tắc cụ thể hơn
Nói mọi PreparedRequest đều bỏ qua biến môi trường proxy là không chính xác. Trong Requests 2.34.2, send tìm proxy mặc định khi thiếu đối số từ khóa proxies. Cung cấp proxies={} cho send bỏ qua đúng nhánh tìm mặc định đó.
Dictionary rỗng truyền cho merge_environment_settings có vai trò khác: phép hợp nhất có thể điền các tuyến môi trường phù hợp vào nó trước khi chuyển cho send. Chỉ nhìn dictionary rỗng trong hai đoạn sẽ bỏ lỡ các phương thức nhận khác nhau.
Trong mã tự xây yêu cầu, giữ chuẩn bị, hợp nhất môi trường và gửi cạnh nhau. Khi ứng dụng chủ ý dùng trust_env=False, phép hợp nhất tôn trọng chính sách đó; nó không ép cài đặt môi trường vào ứng dụng khách đã cố tình tắt chúng.