Лучшая практика при использовании httplib2.Объект Http()

Я пишу оболочку pythonic web API с таким классом, как этот

import httplib2
import urllib

class apiWrapper:

    def __init__(self):
        self.http = httplib2.Http()

    def _http(self, url, method, dict):
        '''
        Im using this wrapper arround the http object
        all the time inside the class
        '''
        params = urllib.urlencode(dict)
        response, content = self.http.request(url,params,method)

как вы можете видеть, я использую _http() метод для упрощения взаимодействия с httplib2.Http() "объект". Этот метод вызывается довольно часто внутри класса, и мне интересно, как лучше всего взаимодействовать с этим объектом:

  • создайте объект в __init__ а то использовать, когда _http() вызывается метод (как показано в коде выше)
  • или создать httplib2.Http() объект внутри метода для каждого вызова _http() метод (как показано в примере кода ниже)

import httplib2
import urllib


class apiWrapper:

    def __init__(self):

    def _http(self, url, method, dict):
        '''Im using this wrapper arround the http object
        all the time inside the class'''
        http = httplib2.Http()
        params = urllib.urlencode(dict)
        response, content = http.request(url,params,method)

2 ответов


вы должны сохранить объект Http, если вы повторно используете соединения. Кажется, httplib2 способен повторно использовать соединения так, как вы используете его в своем первом коде, поэтому это выглядит как хороший подход.

в то же время, из мелкой проверки кода httplib2 кажется, что httplib2 не поддерживает очистку неиспользуемых соединений или даже не замечает, когда сервер решил закрыть соединение, которое он больше не хочет. Если это действительно так, это похоже на ошибку в httplib2 для меня-поэтому я бы предпочел использовать стандартную библиотеку (httplib).


поставка 'connection':' close ' в ваших заголовках должна в соответствии с документами закрыть соединение после получения ответа.:

headers = {'connection': 'close'}
resp, content = h.request(url, headers=headers)