2013-03-01 16 views
5

Python için mükemmel istek kitaplığını kullanarak bir dinlenme API'si için çok basit bir istemci yazdım. Her şey harika çalışıyor, müşteriyi boşta tcp bağlantılarını algılayan ve onları öldüren bir yükleyici ile çalıştırıyorum. İstemcimin, platformumdaki (linux) varsayılanlardan daha farklı tcp canlı seçenekleri kullanmasını istiyorum. Ancak soket kitaplığına yeni soketler için bazı varsayılan seçenekleri seçmek istediğimi söylemenin kolay bir yolunu göremiyorum.İsteklerdeki varsayılan soket seçeneklerini geçersiz kılmak mümkün mü?

socket.create_connection öğesini doğrudan kullanırken bu bir dekoratörle yapılabilecek kadar kolaydır, ancak söz konusu çağrı, 3. çağrıyla ilgili kütüphanede gerçek arama gömülü olduğunda, bu dekore edilmiş aramayı nasıl hazırlayacağımı bilmiyorum. istekleri ile.

+0

tahmin edeyim: gök mavisi? – Dacav

cevap

3

requests tüm her yerde şeyler kanca olmadan socket.create_connection çağırır standart kütüphanenin http.client (veya httplib için 2.x) kullanır, hangi urllib3 kullanan önceden

teşekkürler. Yani, ya bu kütüphanelerden birini çatallamak zorunda kalacaksınız, ya da uçuşa bir süre maymun atmak zorunda kalacaksınız.

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

sen 2.x üzerinde iseniz, büyük olasılıkla kadar basit: kolayca takas edilebilir socket.create_connection etrafında önemsiz bir sarıcı beri

bunu yapmak için en basit yer http.client.connect yılında muhtemelen Yukarıdaki http.client yerine httplib kullanıyorsunuz, ancak bunu doğrulamak isteyebilirsiniz.

+0

Harika bir çözüm, modüllerin kapsamının bu şekilde çalıştığını fark etmemiştim. –

+1

Bu, 'urllib3' 1.8.3'den beri' HTTPConnection.socket_options' veya 'HTTPConnection.default_socket_options' yoluyla yapılabilir. – univerio

5

urllib3'un daha yeni sürümleri (1.8.3, yayımlanan 2014-06-23'ten beri), ayar yuvası seçeneklerini destekler.

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) 

Sonra özel soket gerek oturumlara bu adaptörü monte edebilirsiniz:

Özel bir adaptör oluşturarak (2.4.0 beri 2014-08-29 yayınlandı) requests bu seçenekleri ayarlayabilirsiniz seçenekleri (örn SO_KEEPALIVE ayarı):

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

Bu istek olmalıdır. Oturum()? –

+0

@JasonHeiss Bunlar değiştirilebilir. – univerio

İlgili konular