Pythonでは、http接続を「維持」するため(urllib(2)とは対照的に)httplibを使用しています。今、私はhttplibでcookielibを使いたいのですが、彼らはお互いを嫌っているようです!! (それらを相互にインターフェースする方法はありません)。
誰かがその問題の解決策を知っていますか?
Requests
コードをリファクタリングしなければならない可能性が最も高い場合は、代わりにライブラリの使用を検討する必要があります。その間;
ハックアラート!:)
私は他の提案された方法に行きますが、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...