Как настроить пользовательский http-клиент в Bravado?

Я использую Bravado 3.0.0. Я хочу сделать запрос, который будет использовать мой собственный CA Bundle. Базовый клиент Requests не использует преимущества REQUESTS_CA_BUNDLE env var я установил.

Как передать пользовательский клиент, использующий мой CA Bundle?

2 ответа

Решение

(Этот ответ основан на текущей версии Bravado 8.1.0 на момент написания этой статьи)

Поскольку мне понадобилось некоторое время, чтобы найти этот ответ, когда я узнал о Bravado, и в основном потому, что я думаю, что другие могут выиграть, когда начнем, вот обновленный взгляд на то, как установить соединение:

Чтобы использовать нестандартные настройки в HTTP-клиенте (используя в качестве примера запросы), необходимо создать новый экземпляр HTTP-клиента со своими собственными настройками, а затем передать его в вызов SwaggerClient.from_url():

""" Required to create a new Requests 'http_client' instance: """
from bravado.requests_client import Requestsclient
""" Required to create a Bravado SwaggerClient instance: """
from bravado.client import SwaggerClient

""" Create a new Requests client instance: """
http_client = RequestsClient()

Отсюда вы можете делать все самое интересное, что позволяет делать Requests, например, установить базовую аутентификацию HTTP:

http_client.set_basic_auth(SERVER, USER, PASS)

Или отключите проверку сертификата SSL (не рекомендуется вне тестовой среды):

http_client.session.verify = False

Или, как указывают ваши вопросы и ответы, предоставьте местное хранилище сертификатов для проверки:

http_client.session.cert = os.environ.get('REQUESTS_CA_BUNDLE')

Оттуда просто создать экземпляр SwaggerClient, указав его путь к swagger.json и сослаться на экземпляр http_client запросов (с заранее заданными настройками), например, так:

URL = 'https://myserver/api/path/to/swagger.json'
client = Swaggerclient.from_url(URL, http_client=http_client)

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

Поскольку задана переменная REQUESTS_CA_BUNDLE env var, мы можем создать нового клиента запросов, который настроен на использование CA Bundle. Это может быть передано в SwaggerClient для создания чего-то, что использует CA Bundle при выполнении вызовов Swagger API.

http_client = RequestsClient()
client.session.verify = os.environ.get('REQUESTS_CA_BUNDLE')
client = SwaggerClient.from_url(
    reverse('grafana_generator:swaggerapi', request=request),
    http_client=http_client,
)
Другие вопросы по тегам