пользовательские методы в Python urllib2 - PullRequest
3 голосов
/ 07 октября 2010

Используя urllib2, можем ли мы использовать метод, отличный от 'GET' или 'POST' (когда предоставляются данные)?

Я покопался в библиотеке, и кажется, что решение использовать GET или POST «удобно» связано с тем, предоставляются ли данные в запросе.

Например, я хочу взаимодействовать с базой данных CouchDB, для которой требуются такие методы, как «DEL», «PUT».Я хочу обработчики urllib2, но мне нужно делать свои собственные вызовы методов.

Я бы не хотел импортировать сторонние модули в мой проект, такие как Python API CouchDB.Итак, давайте не будем идти по этому пути.Моя реализация должна использовать модули, которые поставляются с Python 2.6.(Моя спецификация проекта требует использования базового дистрибутива PortablePython).Я бы написал свой собственный интерфейс, используя httplib, перед импортом внешних модулей.

Большое спасибо за помощь

Ответы [ 2 ]

7 голосов
/ 07 октября 2010

Вы можете создать подкласс 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 голосов
/ 02 августа 2018

Это может быть:

import urllib2

method = 'PATH'
request = urllib2.Request('http://host.com')
request.get_method = lambda: method()

То есть модификация класса времени выполнения A.K. Путь обезьяны.

...