Với một header do đơn vị vận hành proxy quy định, Requests cung cấp HTTPAdapter.proxy_headers như một điểm ghi đè:

from urllib.parse import urlsplit
import requests
from requests.adapters import HTTPAdapter

class TaggedProxy(HTTPAdapter):
    def proxy_headers(self, proxy):
        headers = super().proxy_headers(proxy)
        endpoint = urlsplit(proxy)
        if (endpoint.scheme == 'http'
                and endpoint.hostname == 'proxy.example'
                and endpoint.port == 8080):
            headers['X-Proxy-Account'] = 'department-a'
        return headers

with requests.Session() as session:
    adapter = TaggedProxy()
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    response = session.get(
        'https://service.example/data',
        proxies={'https': 'http://proxy.example:8080'},
        timeout=15,
    )

X-Proxy-Account là ví dụ về một trường mà proxy cụ thể này hiểu, không phải cách xác thực chuẩn với mọi trung gian.

Hãy bắt đầu với super().proxy_headers(proxy). Requests dùng phương thức đó để tạo Proxy-Authorization khi URL cung cấp tài khoản Basic. Thay thế toàn bộ kết quả có thể làm mất hành vi đó.

Bộ chuyển đổi chuyển các giá trị này vào ProxyManager của urllib3. Trong đường hầm HTTPS, chúng đi kèm CONNECT. Ánh xạ header yêu cầu thông thường mô tả yêu cầu tới đích sau đó.

Trình quản lý proxy được lưu đệm theo URL proxy. Đừng coi hook này như một lệnh gọi lại không lưu đệm cho từng yêu cầu nghiệp vụ với một giá trị phải thay đổi ở mỗi lần gọi. Hãy chọn quyền sở hữu tầng truyền tải cho phù hợp khi dấu tài khoản thay đổi.

Khi chuyển tiếp HTTP thông thường, các trường proxy vẫn cần chính sách tiêu thụ mà trung gian dự kiến. Việc một header dành riêng cho proxy trong API máy khách không phải là bảo đảm bí mật nếu proxy chuyển tiếp nó.

Bài viết liên quan