【问题标题】:Adding custom headers to all boto3 requests向所有 boto3 请求添加自定义标头
【发布时间】:2019-11-13 00:51:04
【问题描述】:

我需要为发出的每个 boto3 请求添加一些自定义标头。有没有办法管理连接本身以添加这些标头?

对于 boto2,connection.AWSAuthConnection 有一个很有帮助的 build_base_http_request 方法。不过,我还没有在 boto3 文档中找到类似的功能。

【问题讨论】:

    标签: http-headers boto3 botocore header-injection


    【解决方案1】:

    这已经过时了,但我们遇到了同样的问题,所以我发布了我们的解决方案。

    我想为特定请求向 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

    【讨论】:

    • 很好的答案,感谢分享解决方案
    • 这行得通,没有办法将自定义数据传递给事件处理程序,目前我们必须使用全局变量/队列以非 Python 方式进行:( 我已经与 Boto3 开发人员一起打开了问题单对于这个确切的情况:github.com/boto/boto3/issues/2889
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 2013-11-13
      • 2021-08-25
      • 2015-12-18
      相关资源
      最近更新 更多