Python-запросы закрыть http-соединение

мне было интересно, как вы закрываете соединение с запросами (python-requests.org)?

С httplib это HTTPConnection.close(), а как мне сделать то же самое с просьбами?

код ниже:

    r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))

    for line in r.iter_lines():
        if line:
            self.mongo['db'].tweets.insert(json.loads(line))

спасибо заранее.

6 ответов


Как обсуждалось здесь, на самом деле нет такой вещи, как HTTP-соединение, и то, что httplib ссылается на HTTPConnection, действительно является базовым TCP-соединением, которое на самом деле не знает много о ваших запросах вообще. Запросы абстрагируются, и вы никогда не увидите его.

новейшая версия запросов фактически поддерживает TCP-соединение после вашего запроса.. Если вы хотите, чтобы ваш TCP-соединения, вы можете просто настроить запросы не использовать keep-alive.

s = requests.session()
s.config['keep_alive'] = False

Я думаю, что более надежный способ закрытия соединения - сказать sever явно, чтобы закрыть его таким образом соответствует спецификации HTTP:

HTTP / 1.1 определяет параметр" закрыть " соединение для отправителя сигнал о том, что соединение будет закрыто после завершения ответ. Например,

   Connection: close

в полях запроса или заголовка ответа указывается, что соединение не следует рассматривать `настойчивый' (раздел 8.1) после текущий запрос / ответ завершен.

на Connection: close заголовок добавляется к фактическому запрос:

r = requests.post(url=url, data=body, headers={'Connection':'close'})

По Запросам 1.X, соединение доступно на объекте ответа:

r = requests.post("https://stream.twitter.com/1/statuses/filter.json",
                  data={'track': toTrack}, auth=('username', 'passwd'))

r.connection.close()

Я пришел к этому вопросу, чтобы решить "too many open files" error, но я использую requests.session() в моем коде. Несколько поисков позже и я придумал ответ на Python Запрашивает Документацию, который предлагает использовать with блок, чтобы сеанс был закрыт, даже если есть необработанные исключения:

with requests.Session() as s:
    s.get('http://google.com')

если вы не используете сессии, вы можете сделать то же самое: http://docs.python-requests.org/en/master/api/#requests.Response.close

with requests.get('http://httpbin.org/get', stream=True) as r:
    # Do something

пожалуйста, используйте response.close() закрыть, чтобы избежать "слишком много открытых файлов" ошибка

например:

r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))
....
r.close()

это работает для меня:

res = requests.get(<url>, timeout=10).content
requests.session().close()