У нас есть интерфейс, который позволяет отправлять запросы на веб-сервер для определенных данных.
Чтобы подготовить запрос с использованием сеанса, который будет отправлен на сервер, я создаю HTTPSAdapter
class HTTPSAdapter(HTTPAdapter):
"""HTTPS adapter that uses windows certificate stores"""
def init_poolmanager(
self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs
):
self.poolmanager= PoolManager(
num_pools=connections,
maxsize=maxsize,
block=block,
ssl_context=ssl.create_default_context(),
**pool_kwargs
)
Используя этот адаптер, я создаю сеанс с указанным max_retries:
class SessionWithDefaultSslContext(requests.Session):
def __init__(self, retries, backoff_factor, status_forcelist):
super(SessionWithDefaultSslContext, self).__init__()
retry = Retry(
total=retries,
backoff_factor=backoff_factor,
status_forcelist=status_forcelist,
)
self.mount('http://', HTTPAdapter(max_retries=retry))
self.mount('https://', HTTPSAdapter(max_retries=retry))
def requests_retry_session(
self,
retries=3,
backoff_factor=0.3,
status_forcelist=(429, 503),
session=None,
):
"""Create a session with retry and backoff
Got from here:
https://www.peterbe.com/plog/best-practice-with-retries-with-requests
@param retries: number of times to retry
@param backoff_factor: scaling factor for exponential backoff
@param status_forcelist: errors to force retry
@param session: the session
@return: session with retry
"""
session = session or SessionWithDefaultSslContext(retries, backoff_factor, status_forcelist)
return session
И, наконец, отправляю запрос на разные конечные точки с помощью:
with self.requests_retry_session() as session:
r = session.post(url,
auth=self.get_credentials(),
json=data,
verify=True)
return r.status_code == requests.codes.created, r.json()
Япроходя аутентификацию на этом сервере, используя имя пользователя и пароль, а также добавив переменную среды
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
Запросы с этого интерфейса работают нормально в Windows, но в Linux
requests.exceptions.SSLError: HTTPSConnectionPool(host='url', port=443): Max retries exceeded with url: /rest-api/target_builds/ (Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:726)'),))
выдает следующую ошибку