Странная проблема, не могу понять.
У меня есть скрипт, который использует библиотеку запросов Python и запускается на cronjob. Когда я дома через VPN, все работает нормально.
Если я нахожусь в офисе, cronjob возвращает ошибку соединения, точнее NewConnectionError [ошибка 60: время ожидания соединения] (которое вызывается urllib3). Странно то, что если я запускаю скрипт вручную из командной строки, у него нет проблем.
У меня есть только хорошее понимание того, как работают запросы/urllib3/cron. Я предполагаю, что соединение каким-то образом кэшируется, но я не уверен. Кто-нибудь знает, что может быть причиной этого?
Сам скрипт представляет собой утилиту синхронизации, которая создает соединение с API битбакета. Для этого я создал API-оболочку, которая, по сути, является просто объектом для построения запросов. Вот фрагмент из обертки:
def __init__(self, username, password):
s = requests.Session()
s.auth = (username, password)
self._bitbucket_session = s
def _get_context(self, url, paging):
try:
r = self._bitbucket_session.get(url)
if r.status_code == 403:
raise self.BitbucketAPIError('BitbucketAPIError: {}'.format(r.reason))
if 'error' in r.json():
raise self.BitbucketAPIError('BitbucketAPIError: {}'.format(r.json()['error']['message']))
except HTTPError as e:
print("HTTP Error: {}".format(e))
except ConnectTimeout as e:
print("The request timed out while trying to connect to the remote server: {}".format(e))
except ConnectionError as e:
print("Connection Error: {}".format(e))
except Timeout as e:
print("Connection Timed out: {}".format(e))
except RequestException as e:
print("Unhandled exception: {}".format(e))
А вот и упрощенная версия клиента синхронизации, который «кронится»:
bapi = BitbucketApi(username, password)
# blah blah blah
update_members()
update_repository()
bapi.close()
Вот метод закрытия:
def close(self):
self._bitbucket_session.close()