Python request session close

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

Мне было интересно, как вы закрываете связь с Requests (python-requests.org)?

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

 r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data=, 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 определяет опцию «закрыть» соединение для отправителя, чтобы сообщить, что соединение будет закрыто после завершения ответа. Например,

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

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

r = requests.post(url=url, data=body, headers=) 

Я пришел к этому вопросу, пытаясь решить «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=, auth=('username', 'passwd')) . r.close() 

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

r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data=, auth=('username', 'passwd')) r.connection.close() 
res = requests.get(, timeout=10).content requests.session().close() 

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

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

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

Читайте также:  Java md5 hash bytes

Кроме того, если вам нужно отправить несколько запросов в одном и том же сеансе, лучше использовать 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) 

Источник

Оцените статью