Pol
Pol

Reputation: 25585

How to make HTTP DELETE method using urllib2?

Does urllib2 support DELETE or PUT method? If yes provide with any example please. I need to use piston API.

Upvotes: 51

Views: 43397

Answers (5)

Ali Sadik Kumlali
Ali Sadik Kumlali

Reputation: 651

Found following code from https://gist.github.com/kehr/0c282b14bfa35155deff34d3d27f8307 and it worked for me (Python 2.7.5):

import urllib2

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

Upvotes: 12

Wilfred Hughes
Wilfred Hughes

Reputation: 31171

You can define a subclass of the Request object, and call it as follows:

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)

(This is similar to the above answers, but shows usage.)

Upvotes: 1

Dave
Dave

Reputation: 3261

Correction for Raj's answer:

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()

Upvotes: 14

Raj
Raj

Reputation: 3908

You can subclass the urllib2.Request object and override the method when you instantiate the class.

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

Courtesy of Benjamin Smedberg

Upvotes: 7

Corey Goldberg
Corey Goldberg

Reputation: 60644

you can do it with httplib:

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

also, check out this question. the accepted answer shows a way to add other methods to 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)

Upvotes: 77

Related Questions