私はPythonでhttplibを使用しています。なぜなら、HTTP接続(「urllib(2)」に反対)を「キープアライブ」しているからです。今、私はhttplibでcookielibを使用したいが、お互いを憎むように見える!! (それらを一緒にインターフェイスする方法はありません)。pythonでcookielibとhttplibを "keep-alive"にするには?
この問題の解決策を知っている人はいますか?
私はPythonでhttplibを使用しています。なぜなら、HTTP接続(「urllib(2)」に反対)を「キープアライブ」しているからです。今、私はhttplibでcookielibを使用したいが、お互いを憎むように見える!! (それらを一緒にインターフェイスする方法はありません)。pythonでcookielibとhttplibを "keep-alive"にするには?
この問題の解決策を知っている人はいますか?
リンク更新:http://urlgrabber.baseurl.org/help/urlgrabberに変換することもできます。 keepalive.html – mykhal
あなたは、あなたのコードをリファクタリングする必要が早い機会に代わりRequests
ライブラリを使用して検討すべきです。その間;
ハックアラート! :)
私は他の方法を提案していますが、私はhttplibとcookielibの間のインターフェイスを作成します(異なる理由で行われます)。
私がしたことは、最小限の必要なメソッドを使って偽物HTTPRequest
を作成していたので、CookieJar
はそれを認識し、必要に応じてクッキーを処理します。私はその偽のリクエストオブジェクトを使って、cookielibに必要なすべてのデータを設定しました。クラスは、(すべてのIは、現時点では必要)のみHTTPSプロトコルをサポートしている、
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
ご注意:ここでは
は、クラスのコードです。このクラスを使用するコード、(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...
このハックは、多かれ少なかれ同じ事を自分自身で再実装する数時間を節約しました。ありがとうございました。 – zwol
ようこそ、ザック!これが共有の主な理由です。 :) –
は、要件をhttplib使用していますか? cookielibはurllib2でうまく動作し、独自のキープアライブヘッダーを追加できます。 –
すべてを一貫性を保つために、lower()とhas_headerとget_headersのキーをcapitalize()への参照をすべて –