Я пытаюсь закрыть requests.Session(), но он не закрывается.
s = requests.Session()
s.verify = 'cert.pem'
res1 = s.get("https://<ip>:<port>/<route>")
s.close() #Not working
res2 = s.get("https://<ip>:<port>/<route>") # this is still working which means s.close() didn't work.
Как мне закрыть сеанс? s.close() не выдает никаких ошибок, что означает, что это допустимый синтаксис, но я не понимаю, что именно он делает.






В исходном коде requestsSession.close закрывает только все лежащие в основе Adapter. И дальнейшее закрытие Adapter очищает лежащий в основе PoolManager. Тогда все
установленные соединения внутри этого PoolManager будут закрыты. Но PoolManager создаст новое соединение, если нет пригодного для использования соединения.
Критический код:
# requests.Session
def close(self):
"""Closes all adapters and as such the session"""
for v in self.adapters.values():
v.close()
# requests.adapters.HTTPAdapter
def close(self):
"""Disposes of any internal state.
Currently, this closes the PoolManager and any active ProxyManager,
which closes any pooled connections.
"""
self.poolmanager.clear()
for proxy in self.proxy_manager.values():
proxy.clear()
# urllib3.poolmanager.PoolManager
def connection_from_pool_key(self, pool_key, request_context=None):
"""
Get a :class:`ConnectionPool` based on the provided pool key.
``pool_key`` should be a namedtuple that only contains immutable
objects. At a minimum it must have the ``scheme``, ``host``, and
``port`` fields.
"""
with self.pools.lock:
# If the scheme, host, or port doesn't match existing open
# connections, open a new ConnectionPool.
pool = self.pools.get(pool_key)
if pool:
return pool
# Make a fresh ConnectionPool of the desired type
scheme = request_context['scheme']
host = request_context['host']
port = request_context['port']
pool = self._new_pool(scheme, host, port, request_context=request_context)
self.pools[pool_key] = pool
return pool
Итак, если я хорошо понимаю его структуру, когда вы закрываете Session, вы почти то же самое, что создаете новый Session и назначаете его старому. Таким образом, вы все еще можете использовать его для отправки запроса.
Или, если я что-то неправильно понял, добро пожаловать, поправьте меня: D
Когда вы создаете новый PoolManager, он просто содержит пустой pools. Или когда вы clear на PoolManager, он очистит pools.
Но
PoolManagerсоздаст новое соединение, если нет пригодного для использования соединения -> Когда это произойдет?