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))
7 ответов
Как уже обсуждалось здесь, там действительно это не такая вещь, как 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, вы можете сделать то же самое:
Чтобы удалить заголовок «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)
Пожалуйста, используйте response.close() для закрытия, чтобы избежать ошибки «слишком много открытых файлов»
r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data=, auth=('username', 'passwd')) . r.close()
res = requests.get(, timeout=10).content requests.session().close()
По запросам 1.X соединение доступно для объекта ответа:
r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data=, auth=('username', 'passwd')) r.connection.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)
Таким образом, если вы используете последнюю версию запросов, нам кажется, что нам не нужно закрывать соединение самостоятельно.
Кроме того, если вам нужно отправить несколько запросов в одном и том же сеансе, лучше использовать 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)
Response Methods – Python requests
When one makes a request to a URI, it returns a response. This Response object in terms of python is returned by requests.method(), method being – get, post, put, etc. Response is a powerful object with lots of functions and attributes that assist in normalizing data or creating ideal portions of code. For example, response.status_code returns the status code from the headers itself, and one can check if the request was processed successfully or not.
Response object can be used to imply lots of features, methods, and functionalities.
Example :
Python3
Save this file as request.py, and run using below command
Status code 200 indicates that request was made successfully.
Response Methods
Method | Description |
---|---|
response.headers | response.headers returns a dictionary of response headers. |
response.encoding | response.encoding returns the encoding used to decode response.content. |
response.elapsed | response.elapsed returns a timedelta object with the time elapsed from sending the request to the arrival of the response. |
response.close() | response.close() closes the connection to the server. |
response.content | response.content returns the content of the response, in bytes. |
response.cookies | response.cookies returns a CookieJar object with the cookies sent back from the server. |
response.history | response.history returns a list of response objects holding the history of request (url). |
response.is_permanent_redirect | response.is_permanent_redirect returns True if the response is the permanent redirected url, otherwise False. |
response.is_redirect | response.is_redirect returns True if the response was redirected, otherwise False. |
response.iter_content() | response.iter_content() iterates over the response.content. |
response.json() | response.json() returns a JSON object of the result (if the result was written in JSON format, if not it raises an error). |
response.url | response.url returns the URL of the response. |
response.text | response.text returns the content of the response, in unicode. |
response.status_code | response.status_code returns a number that indicates the status (200 is OK, 404 is Not Found). |
response.request | response.request returns the request object that requested this response. |
response.reason | response.reason returns a text corresponding to the status code. |
response.raise_for_status() | response.raise_for_status() returns an HTTPError object if an error has occurred during the process. |
response.ok | response.ok returns True if status_code is less than 200, otherwise False. |
response.links | response.links returns the header links. |
Commonly Used Response Methods
Some methods are most commonly used with response, such as response.json(), response.status_code, response.ok, etc. Requests is mostly used for making http request to APIs(Application Programming Interface). Some of commonly used response methods are discussed here –
response.json()
response.json() returns a JSON object of the result (if the result was written in JSON format, if not it raises an error).
How to use response.json() using Python requests?
To illustrate use of response.json(), let’s ping geeksforgeeks.org. To run this script, you need to have Python and requests installed on your PC.
Python-запросы закрывают http-соединение
Мне было интересно, как закрыть соединение с запросами (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))
Я не думаю, что Requests устанавливает постоянное соединение. нет соединения, которое нужно закрыть. — user849425
@michael, вы получаете постоянный пул соединений бесплатно, если не укажете иное docs.python-requests.org/en/latest/user/advanced/#keep-alive — istruble
@istruble Тогда urllib3 занимается очисткой пула соединений? — user849425
8 ответы
Я думаю, что более надежный способ закрыть соединение — это явно указать серверу, чтобы закрыть его таким образом, совместимый со спецификацией HTTP:
HTTP / 1.1 определяет параметр «закрыть» соединение для отправителя, чтобы сигнализировать о том, что соединение будет закрыто после завершения ответа. Например,
в полях заголовка запроса или ответа указывает, что соединение НЕ ДОЛЖНО считаться «постоянным» (раздел 8.1) после завершения текущего запроса / ответа.
Наблюдения и советы этой статьи мы подготовили на основании опыта команды Connection: close заголовок добавляется к фактическому запросу:
r = requests.post(url=url, data=body, headers=)
Что такое «тело» в данном случае? просто любой <>? — штифтик
@Brad Это зависит от типа контента, например, если вы хотите отправить application/json, вы можете использовать data=json.dumps(payload), если вы просто хотите отправить обычную полезную нагрузку, закодированную в форме, вы можете использовать data=< "k1":"v1", . >. Подробнее см. здесь: docs.python-requests.org/en/latest/user/quickstart/… — Олег Гриб
Это используется здесь но по какой-то причине кажется, что соединение на самом деле не закрыто — я замечаю, потому что в моей ОС заканчиваются порты — чего не должно происходить имхо, если это соединение закрывается правильно. :/- Стефан Фальк
Я пришел к этому вопросу, чтобы решить «too many open files» error , но я использую requests.session() в моем коде. Несколько поисков спустя, и я нашел ответ на Документация по запросам Python который предлагает использовать with block, чтобы сеанс был закрыт, даже если есть необработанные исключения:
with requests.Session() as s: s.get('http://google.com')
with requests.get('http://httpbin.org/get', stream=True) as r: # Do something