2009-06-19 8 views
1

私はPythonでhttplibを使用しています。なぜなら、HTTP接続(「urllib(2)」に反対)を「キープアライブ」しているからです。今、私はhttplibでcookielibを使用したいが、お互いを憎むように見える!! (それらを一緒にインターフェイスする方法はありません)。pythonでcookielibとhttplibを "keep-alive"にするには?

この問題の解決策を知っている人はいますか?

+0

は、要件をhttplib使用していますか? cookielibはurllib2でうまく動作し、独自のキープアライブヘッダーを追加できます。 –

+0

すべてを一貫性を保つために、lower()とhas_headerとget_headersのキーをcapitalize()への参照をすべて –

答えて

2

あなたは、あなたのコードをリファクタリングする必要が早い機会に代わりRequestsライブラリを使用して検討すべきです。その間;

ハックアラート! :)

私は他の方法を提案していますが、私はhttplibcookielibの間のインターフェイスを作成します(異なる理由で行われます)。

私がしたことは、最小限の必要なメソッドを使って偽物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... 
+0

このハックは、多かれ少なかれ同じ事を自分自身で再実装する数時間を節約しました。ありがとうございました。 – zwol

+0

ようこそ、ザック!これが共有の主な理由です。 :) –

関連する問題