2010-10-07 8 views
3

En utilisant urllib2, pouvons-nous utiliser une méthode autre que 'GET' ou 'POST' (quand les données sont fournies)?méthodes personnalisées en python urllib2

J'ai creusé dans la bibliothèque et il semble que la décision d'utiliser GET ou POST soit «commodément» liée à la présence ou non de données dans la requête. Par exemple, je veux interagir avec une base de données CouchDB qui nécessite des méthodes telles que 'DEL', 'PUT'. Je veux les gestionnaires de urllib2, mais j'ai besoin de faire mes propres appels de méthode.

Je préférerais NE PAS importer les modules tiers dans mon projet, tels que l'API CouchDB python. Alors s'il vous plaît ne pas descendre cette route. Mon implémentation doit utiliser les modules fournis avec python 2.6. (Ma spécification de conception nécessite l'utilisation d'une distribution barebones PortablePython). J'écrirais ma propre interface en utilisant httplib avant d'importer des modules externes.

Merci beaucoup pour l'aide

Répondre

7

Vous pouvez sous-classe urllib2.Request comme si (non testé)

import urllib2 

class MyRequest(urllib2.Request): 
    GET = 'get' 
    POST = 'post' 
    PUT = 'put' 
    DELETE = 'delete' 

    def __init__(self, url, data=None, headers={}, 
       origin_req_host=None, unverifiable=False, method=None): 
     urllib2.Request.__init__(self, url, data, headers, origin_req_host, unverifiable) 
     self.method = method 

    def get_method(self): 
     if self.method: 
      return self.method 

     return urllib2.Request.get_method(self) 

opener = urllib2.build_opener(urllib2.HTTPHandler) 
req = MyRequest('http://yourwebsite.com/put/resource/', method=MyRequest.PUT) 

resp = opener.open(req) 
+0

C'est exactement ce que je cherchais à faire. Étendez le module urllib2 pour remplacer la méthode. Ahh la beauté de python. Une modification lors de l'appel d'init sur Request ... urllib2.Request .__ init __ (self, ....) – sbartell

+0

@sbartell: Heureux que cela a fonctionné ... J'ai mis à jour le __init__ pour inclure le moi et aussi changer le get_method pour renvoyer la valeur par défaut des super classes plutôt que de simplement copier sa méthode. – sdolan

Questions connexes