2015-12-05 5 views
-1

Я пытаюсь получить URL-адрес, выполнив запрос POST с использованием модуля urllib2 Python. Я создаю запрос следующим образом.Python urllib2 установка таймаута

handler = urllib2.HTTPHandler() 
opener = urllib2.build_opener(handler) 
url = 'xyz...' 
request = urllib2.Request(url,data='{}') 
request.add_header('Content-Type','application/json') 
request.get_method = lambda: 'POST' 
try: 
    connection = opener.open(request) 
except urllib2.HTTPError as e: 
    connection = e 
except urllib2.URLError as e: 
    print 'TIMEOUT: ' + e.reason 

Я хочу установить тайм-аут для открытого запроса где-нибудь. В документах https://docs.python.org/3.1/library/urllib.request.html вызов build_opener() должен возвращать экземпляр OpenDirector, который должен иметь параметр таймаута. Но я не могу заставить его работать. Кроме того, причина, по которой я создаю запрос, заключается в том, что мне нужно указать пустое тело data='{}' в запросе, и я, похоже, не могу это сделать с urlopen. Любая помощь оценивается.

ответ

1

Вы можете передать timeout в качестве параметра в вызов метода open.

Нормальное функционирование с помощью lambda функции для обеспечения запроса является POST, а не GET без тела

>>> import urllib2 
>>> handler = urllib2.HTTPHandler() 
>>> opener = urllib2.build_opener(handler) 
>>> request = urllib2.Request('http://httpbin.org/post') 
>>> request.get_method = lambda: 'POST' 
>>> opener.open(request) 
<addinfourl at 4363264800 whose fp = <socket._fileobject object at 0x101b654d0>> 

Просто добавьте timeout,

>>> opener.open(request, timeout=0.01) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open 
    response = self._open(req, data) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open 
    '_open', req) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain 
    result = func(*args) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1227, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error timed out> 
+0

Спасибо. Это работает. Не уверен, почему он проголосовал, ссылка не отвечает на мой вопрос. – broccoli

+0

@ broccoli: * «не отвечает на мой вопрос» * неверно. Я вижу 'opener.open (request, timeout = 4)' буквально в ссылке. Недостатком является отсутствие исследований. – jfs

Смежные вопросы