파이썬에서는 httplib을 사용하고 있는데, 이는 http 연결 ("urllib (2)"에 반대)을 "keep-alive"하기 때문입니다. 이제 httplib와 함께 cookielib을 사용하고 싶지만 서로를 증오하는 것처럼 보입니다 !! (이들을 서로 연결하는 방법은 없습니다).파이썬에서 cookielib 및 httplib와 "keep-alive"하는 방법은 무엇입니까?
누구든지이 문제에 대한 해결책을 알고 있습니까?
파이썬에서는 httplib을 사용하고 있는데, 이는 http 연결 ("urllib (2)"에 반대)을 "keep-alive"하기 때문입니다. 이제 httplib와 함께 cookielib을 사용하고 싶지만 서로를 증오하는 것처럼 보입니다 !! (이들을 서로 연결하는 방법은 없습니다).파이썬에서 cookielib 및 httplib와 "keep-alive"하는 방법은 무엇입니까?
누구든지이 문제에 대한 해결책을 알고 있습니까?
링크 업데이트 (http://urlgrabber.baseurl.org/help/urlgrabber)로 변환하여 capitalize()에 대한 모든 참조를 변경해야 할 수 있습니다. keepalive.html – mykhal
대신 당신이 당신의 코드를 리팩토링해야 할 가장 이른 기회에 Requests
라이브러리를 사용하는 것이 좋습니다. 뜻있는 시간에;
해킹! :)
내가 제안한 다른 방법으로 가고 싶지만, httplib과 cookielib 사이의 인터페이스를 만드는 해킹 (다른 이유가 있지만)을 수행했습니다.
내가 한 것은 최소한의 일련의 메소드를 사용하여 가짜 HTTPRequest
을 작성한 것이므로 CookieJar
은이를 인식하고 필요에 따라 쿠키를 처리합니다. 그 가짜 요청 객체를 사용하여 cookielib에 필요한 모든 데이터를 설정했습니다. 클래스 (모든 나는 순간에 필요)에만 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 키를 –