2013-03-01 27 views
5

Tôi đã viết một ứng dụng rất đơn giản cho một API còn lại bằng cách sử dụng thư viện yêu cầu xuất sắc cho python. Tất cả mọi thứ hoạt động tuyệt vời util Tôi chạy các khách hàng thông qua một loadbalancer, mà phát hiện một cách khôn ngoan tcp nhàn rỗi kết nối và giết chúng. Tôi muốn cho khách hàng của tôi để sử dụng một số tcp khác nhau giữ các tùy chọn còn sống hơn là mặc định trên nền tảng của tôi (linux). Nhưng tôi không thấy bất kỳ cách nào dễ dàng để nói với thư viện socket rằng tôi muốn chọn một số tùy chọn mặc định cho các ổ cắm mới.Có thể ghi đè lên các tùy chọn ổ cắm mặc định trong các yêu cầu không?

Khi sử dụng socket.create_connection trực tiếp, việc này dễ dàng thực hiện với trình trang trí, nhưng tôi không biết làm cách nào để thực hiện cuộc gọi được trang trí đó khi cuộc gọi thực sự được chôn trong thư viện của bên thứ ba. với yêu cầu.

cảm ơn trước

+0

Hãy để tôi đoán: azure? – Dacav

Trả lời

3

requests sử dụng urllib3, trong đó sử dụng các thư viện chuẩn của http.client (hoặc httplib, cho 2.x), trong đó kêu gọi socket.create_connection, tất cả mà không cần bất cứ nơi nào để treo điều.

Vì vậy, bạn sẽ phải ngã ba một trong những thư viện đó hoặc bắt chước nó ngay lập tức.

Nơi đơn giản nhất để làm điều đó có lẽ là trong http.client.connect, vì đó là một wrapper tầm thường xung quanh socket.create_connection có thể dễ dàng tháo ra:

orig_connect = http.client.HTTPConnection.connect 
def monkey_connect(self): 
    orig_connect(self) 
    self.sock.setsockopt(…) 
http.client.HTTPConnection.connect = monkey_connect 

Nếu bạn đang ở trên 2.x, nó có thể đơn giản như chỉ cần sử dụng httplib thay vì http.client ở trên, nhưng bạn có thể muốn xác minh điều đó.

+0

Giải pháp tuyệt vời, tôi đã không nhận ra rằng phạm vi mô-đun hoạt động theo cách này. –

+1

Điều này có thể được thực hiện thông qua 'HTTPConnection.socket_options' hoặc' HTTPConnection.default_socket_options' từ 'urllib3' 1.8.3. – univerio

5

Phiên bản mới hơn của urllib3 (kể từ 1.8.3, phát hành 2014-06-23) hỗ trợ tùy chọn cài đặt ổ cắm.

Bạn có thể thiết lập các tùy chọn từ requests (từ 2.4.0, phát hành 2014/08/29) bằng cách tạo ra một bộ chuyển đổi tùy chỉnh:

class HTTPAdapterWithSocketOptions(requests.adapters.HTTPAdapter): 
    def __init__(self, *args, **kwargs): 
     self.socket_options = kwargs.pop("socket_options", None) 
     super(HTTPAdapterWithSocketOptions, self).__init__(*args, **kwargs) 

    def init_poolmanager(self, *args, **kwargs): 
     if self.socket_options is not None: 
      kwargs["socket_options"] = self.socket_options 
     super(HTTPAdapterWithSocketOptions, self).init_poolmanager(*args, **kwargs) 

Sau đó, bạn có thể gắn bộ chuyển đổi này đến phiên cần ổ cắm tùy chỉnh tùy chọn (ví dụ: thiết lập SO_KEEPALIVE):

adapter = HTTPAdapterWithSocketOptions(socket_options=[(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)]) 
s = requests.session() 
s.mount("http://", adapter) 
s.mount("https://", adapter) 
+0

Nếu đó là yêu cầu.Session()? –

+0

@JasonHeiss Những thứ này có thể thay thế được. – univerio

Các vấn đề liên quan