Лучшая практика при использовании объекта httplib2.Http () - PullRequest
6 голосов
/ 08 августа 2009

Я пишу Python-оболочку веб-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 ]

7 голосов
/ 13 апреля 2010

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

headers = {'connection': 'close'}
resp, content = h.request(url, headers=headers)
2 голосов
/ 08 августа 2009

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

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

...