socket ResourceWarning с использованием urllib в Python 3
Я использую urllib.запрос.urlopen (), чтобы получить от веб-службы, которую я пытаюсь протестировать.
Это возвращает объект HTTPResponse, который я затем прочитал (), чтобы получить тело ответа.
но я всегда вижу ResourceWarning о незамкнутом сокете из socket.py
вот соответствующая функция:
from urllib.request import Request, urlopen
def get_from_webservice(url):
""" GET from the webservice """
req = Request(url, method="GET", headers=HEADERS)
with urlopen(req) as rsp:
body = rsp.read().decode('utf-8')
return json.loads(body)
вот предупреждение, как оно появляется в выходных данных программы:
$ ./test/test_webservices.py
/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/socket.py:359: ResourceWarning: unclosed <socket.socket object, fd=5, family=30, type=1, proto=6>
self._sock = None
.s
----------------------------------------------------------------------
Ran 2 tests in 0.010s
OK (skipped=1)
Если есть что-то, что я могу сделать с HTTPResponse (или просьба?) для того чтобы сделать его закрыть свое гнездо чисто, Я бы очень хотел знать, потому что этот код для моих модульных тестов; мне не нравится игнорируя предупреждения где угодно, но только не там.
1 ответов
Я не знаю, если это на ответ, но это часть пути к ответу.
Если я добавлю заголовок "connection: close" к ответу от моих веб-служб, объект HTTPResponse, похоже, очистится должным образом без предупреждения.
и фактически, спецификация HTTP (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) говорит:
HTTP/1.1 приложения, которые не поддерживают постоянные соединения должны включите опцию "Закрыть" соединение в каждое сообщение.
Итак, проблема была на сервере (т. е. моя ошибка!). В случае, если у вас нет контроля над заголовками, поступающими с сервера, я не знаю, что вы можете сделать.