Python-Requests закрывает http соединение

Мне было интересно, как вы закрываете связь с Requests (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))

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

8 ответов

Решение

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

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

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

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

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

   Connection: close

в полях заголовка запроса или ответа указывается, что соединение НЕ СЛЕДУЕТ считать "постоянным" (раздел 8.1) после завершения текущего запроса / ответа.

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

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

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

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

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

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

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

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

r.connection.close()

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

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

По последним запросам (2.25.1), requests.<method> закроет соединение по умолчанию

      with sessions.Session() as session:
    return session.request(method=method, url=url, **kwargs)

https://github.com/psf/requests/blob/master/requests/api.py#L60

Таким образом, если вы используете последнюю версию запросов, нам кажется, что нам не нужно закрывать соединение самостоятельно.

Кроме того, если вам нужно отправить несколько запросов в одном и том же сеансе, лучше использовать requests.Session()вместо того, чтобы открывать / закрывать соединение несколько раз. БЫВШИЙ:

      with requests.Session() as s:
    r = s.get('https://example.org/1/')
    print(r.text)
    r = s.get('https://example.org/2/')
    print(r.text)
    r = s.get('https://example.org/3/')
    print(r.text)

Чтобы удалить заголовок keep-alive в запросах, я просто создал его из объекта Request, а затем отправил с помощью Session

headers = {
'Host' : '1.2.3.4',
'User-Agent' : 'Test client (x86_64-pc-linux-gnu 7.16.3)',
'Accept' : '*/*',
'Accept-Encoding' : 'deflate, gzip',
'Accept-Language' : 'it_IT'
}

url = "https://stream.twitter.com/1/statuses/filter.json"
#r = requests.get(url, headers = headers) #this triggers keep-alive: True
s = requests.Session()
r = requests.Request('GET', url, headers)
Другие вопросы по тегам