在python中,我使用httplib是因爲它保持http連接(與urllib(2)相反)。現在,我想用httplib使用cookielib,但他們似乎互相討厭! (沒有辦法將它們連接在一起)。如何在python中用cookielib和httplib保持活力?
有沒有人知道解決這個問題?
在python中,我使用httplib是因爲它保持http連接(與urllib(2)相反)。現在,我想用httplib使用cookielib,但他們似乎互相討厭! (沒有辦法將它們連接在一起)。如何在python中用cookielib和httplib保持活力?
有沒有人知道解決這個問題?
)鏈接更新:http://urlgrabber.baseurl.org/help/urlgrabber。 keepalive.html – mykhal 2010-03-09 14:48:26
你應該考慮使用Requests
庫,而不是在你重構你的代碼最早的機會。同時;
HACK ALERT! :)
我會採取其他建議的方式,但我做了一個黑客(做了不同的原因,雖然),這確實創建httplib和cookielib之間的接口。
我所做的是用最少的必需方法創建一個假的HTTPRequest
,以便CookieJar
可以識別它並根據需要處理cookie。我使用了假的請求對象,設置了cookielib所需的所有數據。
下面是類代碼:
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響應兼容)的代碼,:
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...
使用httplib的要求? cookielib與urllib2協同工作,您可以添加自己的保持活動標題。 – 2009-06-19 13:46:15
爲了保持所有內容的一致性,您可能需要將lower()和has_header和get_headers鍵的所有引用更改爲lowerdate( – 2010-08-09 05:53:04