2010-01-05 15 views

Respuesta

25

Si cambia a httplib, tendrá un control más preciso sobre la conexión subyacente.

Por ejemplo:

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() 

Esto enviaría 2 HTTP GET en la misma conexión TCP subyacente.

+0

Esa es una buena respuesta ya que httplib es parte de python. Eso nos ahorra tener que instalar un módulo de terceros. ¡Gracias! –

+0

Tal vez sea para alguien útil, también existe HTTPSConnection. – Petr

2

He usado la biblioteca de terceros urllib3 con buenos resultados en el pasado. Está diseñado para complementar urllib2 agrupando conexiones para su reutilización.

ejemplo Modificado de the wiki:

>>> 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

No puedo encontrar esta biblioteca, el enlace está muerto. ¿Te importaría mirar http://stackoverflow.com/questions/18221809/sending-a-few-requests-using-one-connection? –

0

Si necesita algo más automático que httplib llano, esto podría ayudar, aunque no es THREADSAFE.

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 
Cuestiones relacionadas