如何在 Bravado 中设置自定义 http 客户端?

How do you set a custom http client in Bravado?

我正在使用 Bravado 3.0.0。我想提出一个使用我自己的自定义 CA Bundle 的请求。底层请求客户端没有利用我设置的 REQUESTS_CA_BUNDLE 环境变量。

如何传入使用我的 CA 捆绑包的自定义客户端?

我在这里回答我自己的问题,因为我在这个问题上停留了一段时间,认为分享我学到的东西会很好。

由于设置了 REQUESTS_CA_BUNDLE env var,我们可以创建一个新的请求客户端,该客户端被配置为使用 CA Bundle。可以将其传递到 SwaggerClient 以生成在进行 Swagger API 调用时使用 CA Bundle 的东西。

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,
)

(此答案基于 Bravado 的当前 8.1.0 版本)

因为我在学习 Bravado 的过程中花了一段时间才找到这个答案,而且主要是因为我认为其他人在开始时可能会受益,这里是关于如何建立联系的更新:

为了利用 HTTP 客户端中的非默认设置,(以 Requests 为例)必须使用自己的设置创建一个新的 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 路径,然后引用 Requests 'http_client' 实例(使用预定义设置),就像这样:

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