【发布时间】:2019-11-13 00:51:04
【问题描述】:
我需要为发出的每个 boto3 请求添加一些自定义标头。有没有办法管理连接本身以添加这些标头?
对于 boto2,connection.AWSAuthConnection 有一个很有帮助的 build_base_http_request 方法。不过,我还没有在 boto3 文档中找到类似的功能。
【问题讨论】:
标签: http-headers boto3 botocore header-injection
我需要为发出的每个 boto3 请求添加一些自定义标头。有没有办法管理连接本身以添加这些标头?
对于 boto2,connection.AWSAuthConnection 有一个很有帮助的 build_base_http_request 方法。不过,我还没有在 boto3 文档中找到类似的功能。
【问题讨论】:
标签: http-headers boto3 botocore header-injection
这已经过时了,但我们遇到了同样的问题,所以我发布了我们的解决方案。
我想为特定请求向 boto3 添加自定义标头。 我找到了这个:https://github.com/boto/boto3/issues/2251,并使用事件系统添加标题
def _add_header(request, **kwargs):
request.headers.add_header('x-trace-id', 'trace-trace')
print(request.headers) # for debug
some_client = boto3.client(service_name=SERVICE_NAME)
event_system = some_client.meta.events
event_system.register_first('before-sign.EVENT_NAME.*', _add_header)
您可以尝试对所有请求使用通配符:
event_system.register_first('before-sign.*.*', _add_header)
*SERVICE_NAME- 你可以在这里找到所有可用的服务:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html
有关将函数注册到特定事件的更多信息:https://boto3.amazonaws.com/v1/documentation/api/latest/guide/events.html
【讨论】:
@May Yaari 的回答非常棒。对于@arainchi 提出的问题:
这行得通,没有办法将自定义数据传递给事件处理程序,目前我们必须使用全局变量/队列以非 Python 的方式进行:(我已经为这个确切的案例向 Boto3 开发人员打开了问题单
实际上,我们可以利用 python 函数式编程属性:returning a function inside a function 绕过:
如果我们想在标题中添加自定义值custom_variable,我们可以这样做
some_client = boto3.client(service_name=SERVICE_NAME)
event_system = some_client.meta.events
event_system.register_first('before-sign.EVENT_NAME.*', _register_callback(custom_variable))
def _register_callback(custom_variable):
def _add_header(request, **kwargs):
request.headers.add_header('header_name_you_want', custom_variable)
return _add_header
或者使用lambda的更pythonic方式
some_client = boto3.client(service_name=SERVICE_NAME)
event_system = some_client.meta.events
event_system.register_first('before-sign.EVENT_NAME.*', lambda request, **kwargs: _add_header(request, custom_variable))
def _add_header(request, custom_variable):
request.headers.add_header('header_name_you_want', custom_variable)
【讨论】: