2010-01-05 7 views

cevap

25

httplib'a geçiş yaparsanız, temel bağlantı üzerinde daha iyi bir kontrole sahip olacaksınız. Örneğin

:

import httplib 

conn = httplib.HTTPConnection(url) 

conn.request('GET', '/foo') 
r1 = conn.getresponse() 
r1.read() 

conn.request('GET', '/bar') 
r2 = conn.getresponse() 
r2.read() 

conn.close() 

bu 2 HTTP aynı temel TCP bağlantısı üzerinde GETler gönderirdi.

+0

Bu, httplib python'un bir parçası olduğu için iyi bir yanıttır. Bu bizi üçüncü bir parti modülü kurmak zorunda kalmamamızdan kurtarıyor. Teşekkürler! –

+0

Belki birileri için yararlı olacak, HTTPSConnection da var. – Petr

2

Geçmişte iyi bir etki yaratmak için üçüncü taraf urllib3 kitaplığını kullandım. Yeniden kullanım için havuzları birleştirerek urllib2'u tamamlayacak şekilde tasarlanmıştır. the wiki den

Modifiye örnek: düz httplib daha otomatik bir şey gerekiyorsa

>>> from urllib3 import HTTPConnectionPool 
>>> # Create a connection pool for a specific host 
... http_pool = HTTPConnectionPool('www.google.com') 
>>> # simple GET request, for example 
... r = http_pool.urlopen('GET', '/') 
>>> print r.status, len(r.data) 
200 28050 
>>> r = http_pool.urlopen('GET', '/search?q=hello+world') 
>>> print r.status, len(r.data) 
200 79124 
+0

Bu kütüphaneyi bulamıyorum, link öldü. http://stackoverflow.com/questions/18221809/sending-a-few-requests-using-one-connection adresine bakabilir misiniz? –

0

, işte bu evre korumalı değil de, yardımcı olabilir.

try: 
    from http.client import HTTPConnection, HTTPSConnection 
except ImportError: 
    from httplib import HTTPConnection, HTTPSConnection 
import select 
connections = {} 


def request(method, url, body=None, headers={}, **kwargs): 
    scheme, _, host, path = url.split('/', 3) 
    h = connections.get((scheme, host)) 
    if h and select.select([h.sock], [], [], 0)[0]: 
     h.close() 
     h = None 
    if not h: 
     Connection = HTTPConnection if scheme == 'http:' else HTTPSConnection 
     h = connections[(scheme, host)] = Connection(host, **kwargs) 
    h.request(method, '/' + path, body, headers) 
    return h.getresponse() 


def urlopen(url, data=None, *args, **kwargs): 
    resp = request('POST' if data else 'GET', url, data, *args, **kwargs) 
    assert resp.status < 400, (resp.status, resp.reason, resp.read()) 
    return resp