2010-10-07 55 views
3

使用urllib2,我们能够使用'GET'或'POST'以外的方法(当提供数据时)吗?python中的自定义方法urllib2

我挖掘了一下库,看起来使用GET或POST的决定很方便地与请求中是否提供了数据相关联。

例如,我想与需要诸如'DEL','PUT'等方法的CouchDB数据库进行交互。我想要urllib2的处理程序,但需要自己调用方法。

我希望不要导入第三方模块到我的项目中,例如CouchDB python api。所以,请不要走那条路。我的实现必须使用Python 2.6附带的模块。 (我的设计规范要求使用准系统PortablePython发行版)。在导入外部模块之前,我会使用httplib编写自己的界面。

感谢这么多的帮助

回答

7

你可以继承urllib2.Request像这样(未经)

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

这正是我一直在寻找这样做。扩展urllib2模块以覆盖该方法。蟒蛇的美丽。 在请求...上调用init时发生的一个变化... urllib2.Request .__ init __(self,....) – sbartell 2010-10-08 07:21:17

+0

@sbartell:很高兴它解决了问题......我更新了__init__以包含自己, get_method返回超类的默认值,而不是仅仅复制它的方法。 – sdolan 2010-10-08 18:00:50