2009-08-08 4 views
6

J'écris une enveloppe API web pythonique avec une classe comme celui-ciLes meilleures pratiques lors de l'utilisation httplib2.Http() objet

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) 

comme vous pouvez le voir, je suis en utilisant la méthode _http() pour simplifier l'interaction avec l'objet httplib2.Http(). Cette méthode est appelée assez souvent à l'intérieur de la classe et je me demande quelle est la meilleure façon d'interagir avec cet objet:

  • créer l'objet dans le __init__ puis réutilisation quand la méthode _http() est appelée (comme représenté dans le code ci-dessus)
  • ou créer l'objet httplib2.Http() à l'intérieur du procédé pour chaque appel de la méthode _http() (comme représenté dans l'exemple de code ci-dessous)

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) 

Répondre

2

Vous devez garder l'objet Http si vous réutiliser les connexions. Il semble que httplib2 est capable de réutiliser les connexions de la façon dont vous l'utilisez dans votre premier code, donc cela semble être une bonne approche. En même temps, à partir d'une inspection superficielle du code httplib2, il semble que httplib2 ne supporte pas le nettoyage des connexions inutilisées, ni même le moment où un serveur a décidé de fermer une connexion dont il ne veut plus. Si c'est effectivement le cas, cela ressemble à un bogue dans httplib2 - donc je préfère utiliser la bibliothèque standard (httplib) à la place.

7

« connexion » Fourniture: « fermer » dans vos en-têtes devraient selon les docs fermer la connexion après réception d'une réponse .:

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