【问题标题】:How to make HTTP DELETE method using urllib2?如何使用 urllib2 制作 HTTP DELETE 方法?
【发布时间】:2011-05-29 12:52:38
【问题描述】:

urllib2 是否支持 DELETE 或 PUT 方法?如果是,请提供任何示例。我需要使用活塞 API。

【问题讨论】:

    标签: python urllib2


    【解决方案1】:

    您可以使用httplib

    import httplib 
    conn = httplib.HTTPConnection('www.foo.com')
    conn.request('PUT', '/myurl', body) 
    resp = conn.getresponse()
    content = resp.read()
    

    另外,请查看此question。接受的答案显示了一种向 urllib2 添加其他方法的方法:

    import urllib2
    opener = urllib2.build_opener(urllib2.HTTPHandler)
    request = urllib2.Request('http://example.org', data='your_put_data')
    request.add_header('Content-Type', 'your/contenttype')
    request.get_method = lambda: 'PUT'
    url = opener.open(request)
    

    【讨论】:

    • 是你!感谢在 Python 中通过 wmi 使用 Windows 监控的示例,这些对我有很大帮助:)
    • 不错.. httplib 不支持认证?
    • 在以下情况下使用 urllib2 进行身份验证:request.add_header( 'Authorization', b'Basic ' + 'user:password'.encode('base64').replace('\n','') )
    【解决方案2】:

    更正 Raj 的回答:

    import urllib2
    class RequestWithMethod(urllib2.Request):
      def __init__(self, *args, **kwargs):
        self._method = kwargs.pop('method', None)
        urllib2.Request.__init__(self, *args, **kwargs)
    
      def get_method(self):
        return self._method if self._method else super(RequestWithMethod, self).get_method()
    

    【讨论】:

    • 使用self._method = kwargs.pop('method', None)会更短
    • 使用 super 给我一个 TypeError。相反,我使用了urllib2.Request.get_method(self)
    【解决方案3】:

    https://gist.github.com/kehr/0c282b14bfa35155deff34d3d27f8307 找到以下代码,它对我有用(Python 2.7.5):

    import urllib2
    
    request = urllib2.Request(uri, data=data)
    request.get_method = lambda: 'DELETE'
    response = urllib2.urlopen(request)
    

    【讨论】:

    • 如此肮脏干净:/
    【解决方案4】:

    您可以子类化 urllib2.Request 对象并在实例化该类时覆盖该方法。

    import urllib2
    
    class RequestWithMethod(urllib2.Request):
      def __init__(self, method, *args, **kwargs):
        self._method = method
        urllib2.Request.__init__(*args, **kwargs)
    
      def get_method(self):
        return self._method
    

    感谢Benjamin Smedberg

    【讨论】:

      【解决方案5】:

      你可以定义Request对象的子类,调用如下:

      import urllib2
      
      class RequestWithMethod(urllib2.Request):
          def __init__(self, *args, **kwargs):
              self._method = kwargs.pop('method', None)
              urllib2.Request.__init__(self, *args, **kwargs)
      
          def get_method(self):
              return self._method if self._method else super(RequestWithMethod, self).get_method()
      
      
      def put_request(url, data):
          opener = urllib2.build_opener(urllib2.HTTPHandler)
          request = RequestWithMethod(url, method='PUT', data=data)
          return opener.open(request)
      
      
      def delete_request(url):
          opener = urllib2.build_opener(urllib2.HTTPHandler)
          request = RequestWithMethod(url, method='DELETE')
          return opener.open(request)
      

      (这类似于上面的答案,但显示了用法。)

      【讨论】:

        猜你喜欢
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 2022-07-10
        • 2012-03-25
        • 2016-01-08
        • 2018-03-07
        • 1970-01-01
        • 2023-01-30
        相关资源
        最近更新 更多