首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中使用cookielib和httplib“保持活跃”?

如何在python中使用cookielib和httplib“保持活跃”?
EN

Stack Overflow用户
提问于 2009-06-19 07:32:12
回答 2查看 9K关注 0票数 1

在python中,我使用httplib是因为它“保持活动”http连接(而不是urllib(2))。现在,我想使用cookielib和httplib,但他们似乎彼此讨厌!(没有办法将它们连接在一起)。

有没有人知道这个问题的解决方案?

EN

回答 2

Stack Overflow用户

发布于 2009-06-19 08:26:39

HTTP handler for urllib2 that supports keep-alive

票数 2
EN

Stack Overflow用户

发布于 2009-06-27 20:51:40

您应该考虑尽早使用Requests库来重构您的代码。在此同时,还应注意到:

黑客警报!:)

我会用另一种建议的方式,但我已经做了一个hack (尽管出于不同的原因),它确实在httplibcookielib之间创建了一个接口。

我所做的就是用最少的方法集创建一个假的HTTPRequest,这样CookieJar就可以识别它并根据需要处理cookie。我使用了那个假的请求对象,设置了cookielib所需的所有数据。

下面是这个类的代码:

代码语言:javascript
复制
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

请注意,这个类只支持HTTPS协议(这是我目前需要的全部)。

使用这个类的代码是(请注意另一个使响应与cookielib兼容的技巧):

代码语言:javascript
复制
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...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1016765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档