Pregunta sobre python, urllib2, httplib, cookies – ¿Cómo “mantener vivo” con cookielib y httplib en python?

1

En Python, estoy usando httplib porque "mantiene viva" la conexión http (como oposición a urllib (2)). ¡Ahora, quiero usar cookielib con httplib pero parecen odiarse unos a otros! (No hay manera de interconectarlos).

¿Alguien sabe de una solución a ese problema?

Para mantener todo coherente, es posible que desee cambiar todas las referencias a mayúsculas () con las teclas lower () y has_header y get_headers convertidas a menores también. user414742
¿Está utilizando httplib un requisito? cookielib funciona muy bien con urllib2 y puedes agregar tus propios encabezados para mantenerte vivo. Corey Goldberg

Tu respuesta

2   la respuesta
2

Debes considerar usar elRequests biblioteca en lugar de la primera oportunidad que tenga para refactorizar su código. Mientras tanto;

¡HACK ALERTA! :)

Iría por otro camino sugerido, pero he hecho un hack (hecho por diferentes motivos), lo que crea una interfaz entrehttplib ycookielib.

Lo que hice fue crear un falso.HTTPRequest con mínimo conjunto de métodos requeridos, para queCookieJar Lo reconocería y procesaría las cookies según sea necesario. He usado ese objeto de solicitud falsa, configurando todos los datos necesarios para cookielib.

Aquí está el código de la clase:

<code>class HTTPRequest( object ):
"""
Data container for HTTP request (used for cookie processing).
"""

    def __init__( self, host, url, headers={}, secure=False ):
        self._host = host
        self._url = url
        self._secure = secure
        self._headers = {}
        for key, value in headers.items():
            self.add_header(key, value)

    def has_header( self, name ):
        return name in self._headers

    def add_header( self, key, val ):
        self._headers[key.capitalize()] = val

    def add_unredirected_header(self, key, val):
        self._headers[key.capitalize()] = val

    def is_unverifiable( self ):
        return True

    def get_type( self ):
        return 'https' if self._secure else 'http'

    def get_full_url( self ):
        port_str = ""
        port = str(self._host[1])
        if self._secure:
            if port != 443:
                port_str = ":"+port
        else:
            if port != 80:
                port_str = ":"+port
        return self.get_type() + '://' + self._host[0] + port_str + self._url

    def get_header( self, header_name, default=None ):
        return self._headers.get( header_name, default )

    def get_host( self ):
        return self._host[0]

    get_origin_req_host = get_host

    def get_headers( self ):
        return self._headers
</code>

Tenga en cuenta que la clase solo admite el protocolo HTTPS (todo lo que necesitaba en este momento).

El código que usó esta clase fue (tenga en cuenta otro truco para que la respuesta sea compatible con cookielib):

<code>cookies = CookieJar()

headers = {
    # headers that you wish to set
}

# construct fake request
fake_request = HTTPRequest( host, request_url, headers )

# add cookies to fake request
cookies.add_cookie_header(fake_request)

# issue an httplib.HTTPConnection based request using cookies and headers from the fake request
http_connection.request(type, request_url, body, fake_request.get_headers())

response = http_connection.getresponse()

if response.status == httplib.OK:
    # HACK: pretend we're urllib2 response
    response.info = lambda : response.msg

    # read and store cookies from response
    cookies.extract_cookies(response, fake_request)

    # process response...
</code>
¡Bienvenido, Zack! Esa es la razón principal para compartir. :) Serge Broslavsky
Este truco me salvó un par de horas de reimplementar más o menos lo mismo que yo. Gracias. zwol

Preguntas relacionadas