ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Boto3 资源核心(Resources Core)参考:从 Resource Model 到 Factory 的源码级解析

Boto3 资源核心(Resources Core)参考:从 Resource Model 到 Factory 的源码级解析 后端云原生【免费下载链接】boto3AWS SDK for Python (Boto3)项目地址https://gitcode.com/gh_mirrors/bo/boto3点击查看免费下载本文以 Resources reference 为骨架逐层拆解 Boto3 面向对象资源层boto3.resources的六大核心模块资源模型model、请求参数params、响应处理器response、资源动作action、资源基类base与资源工厂factory。读完本文你将掌握资源 JSON 定义如何被解析成ResourceModel、请求参数如何从标识符/数据成员/常量自动填充、低层 API 响应如何被转换为资源实例以及boto3.resource(sqs)背后完整的对象生成链路。一、资源层全景参考文档在讲什么docs/source/reference/core/resources.rst是 Boto3 文档集中 Core References见 index.rst下的 API 参考页它通过 Sphinx 的automodule指令将boto3.resources包中六个核心模块的公开类与函数全部纳入文档化范围参考文档中的小节对应模块文档化内容Resource modelboto3.resources.modelIdentifier、Action、Parameter、Request、Waiter、ResponseResource、Collection、ResourceModelRequest parametersboto3.resources.paramsget_data_member、create_request_parameters、build_param_structureResponse handlersboto3.resources.responseall_not_none、build_identifiers、build_empty_response、RawHandler、ResourceHandlerResource actionsboto3.resources.actionServiceAction、BatchAction、WaiterAction、CustomModeledActionResource baseboto3.resources.baseResourceMeta、ServiceResourceResource factoryboto3.resources.factoryResourceFactory这一层是整个 Boto3 资源接口面向对象 API如sqs.Queue(url).receive_messages()的底层支撑。与之相对的是低层 Client 接口如sqs_client.receive_message(...)资源接口在 Client 之上提供了对象化、可组合的抽象。参考页本身是 API 索引但其背后每个符号都在boto3/resources/目录中有完整实现本文将结合源码与实际服务定义数据逐一展开。二、Resource model资源 JSON 定义的 Python 化抽象boto3/resources/model.py的开篇注释说明了该模块的定位将资源 JSON 描述格式抽象为一组 Python 对象好处是接口 Pythonic例如action.request.operation这样的属性链且当 JSON 字段发生重命名等小改动时消费方代码无需变更。这些模型同时被两类消费者使用生成资源类的ResourceFactory以及文档生成器。2.1 核心模型类速览模型层把一份resources-1.json拆解成以下对象Identifier资源标识符仅有name标识符名称与memberName对应 shape 成员名可选两个属性。Action一次服务操作动作包含name、requestRequest对象或None、resourceResponseResource对象或None、pathJMESPath 搜索路径可为None。DefinitionWithParams拥有params属性的基类Request与Waiter都继承它。params属性会遍历 JSON 中的params列表逐项构造Parameter(**item)。Parameter自动填充的参数核心字段是target目标参数名如QueueUrl、source来源类型、name、pathJMESPath 查询、value常量值。若 JSON 中出现未知字段会通过logger.warning告警。Request服务操作请求在DefinitionWithParams基础上增加operation低层服务操作名。Waiter等待器规格常量PREFIX WaitUntil字段name与waiterName底层等待器名称。ResponseResource动作执行后要创建的资源字段type资源类型名与pathJMESPath 查询并提供identifiers属性解析为Parameter列表与model属性返回该类型的ResourceModel。Collection一组资源继承Action额外提供batch_actions属性便捷访问其资源类型的批量动作。ResourceModel一个资源的完整模型包含标识符、属性、动作、子资源、引用与集合。2.2 命名冲突处理load_rename_map资源模型可能遇到命名冲突同一个名字可能同时是 shape 成员属性、动作、子资源、集合等。ResourceModel.load_rename_map定义了明确的优先级从高到低加载动作resource.load标识符Identifiers动作Actions子资源Subresources引用References集合Collections等待器Waiters属性shape 成员_load_name_with_category在名字已被占用时为其追加类别后缀如id冲突后变为id_action、id_collection、id_attribute并维护_renamed字典若追加后缀后仍冲突则直接抛出ValueError。注意meta是资源的保留名任何类别都不能占用。批处理动作只暴露在集合上因此不参与重命名子资源使用大写驼峰命名几乎只可能与其他子资源冲突。2.3 服务资源的特殊处理_get_has_definition_get_has_definition有一个精巧设计当模型名不在resource_defs中即它是服务级资源如sqs本身时服务资源会暴露该服务定义的所有资源作为子资源使s3.Object(bucket-name, key)这类调用即使 JSON 中没有显式定义也能工作。对每个资源类型它会检查是否在has关系里已有映射若没有则构造一个伪造的 has 定义将所有标识符的source设为input要求用户显式传入。2.4 真实数据印证SQS 资源定义以 SQS 资源定义 为例service.actions.CreateQueue请求操作为CreateQueue响应资源为Queue其标识符Url从响应QueueUrl字段source: response取得。service.has.QueueQueue子资源的Url标识符来源为input用户传入。service.hasMany.Queues集合请求操作ListQueues标识符Url从QueueUrls[]列表取JMESPath 路径。resources.Message标识符为QueueUrl和ReceiptHandlememberName指向 shape 成员动作Delete的请求参数QueueUrl、ReceiptHandle均从资源标识符自动填充batchActions.Delete使用Entries[*].Id数据成员与Entries[*].ReceiptHandle标识符构造批量删除参数。resources.Queueload请求为GetQueueAttributes参数AttributeNames[]是硬编码字符串常量Allsource: stringpath: 表示把整个响应作为资源数据。这些定义展示了Parameter的四种source类型在真实数据中的完整用法identifier、data、string/integer/boolean常量、input。三、Request parameters请求参数的自动填充管线boto3/resources/params.py负责把资源模型中的参数定义转换成真实请求参数字典。核心链路是create_request_parameters→get_data_member/build_param_structure。3.1 create_request_parameters按来源取值的分发器create_request_parameters(parent, request_model, paramsNone, indexNone)遍历request_model.params对每个Parameter按其source分发identifier从父资源实例读取标识符属性getattr(parent, xform_name(param.name))。data通过get_data_member从父资源数据中按 JMESPath 查询取值可能触发一次load。string/integer/boolean直接取定义中的常量value。input由用户调用时传入此处直接跳过。其他来源抛出NotImplementedError。函数支持传入既有params字典反复累加这对批量动作中反向 JMESPath 追加到列表的场景尤其有用index参数用于指定条目在列表中的位置。3.2 get_data_member延迟加载的数据访问get_data_member(parent, path)先检查parent.meta.data是否为空若为空且有load方法则先调用load()否则抛出ResourceLoadException提示has no load method。随后用jmespath.search(path, parent.meta.data)查询数据。这解释了资源属性的懒加载行为首次访问属性时会自动发起一次load请求。3.3 build_param_structure反向 JMESPathbuild_param_structure(params, target, value, indexNone)是文档中自带 doctest 的精巧函数实现反向 JMESPath从test[0]这类路径字符串构造嵌套对象。例如 build_param_structure(params, test[0], 1) print(params) {test: [1]} build_param_structure(params, foo.bar[0].baz, hello world) print(params) {test: [1], foo: {bar: [{baz: hello, world}]}}实现上先用正则INDEX_RE re.compile(r\[(.*)\]$)检测[N]/[]/[*]三种索引形式逐步在params中下钻pos指针数组项默认按字典占位填充末尾项才真正写入值。SQS 定义中的Entries[*].Id、AttributeNames[]正是经由此函数展开成目标请求结构的。四、Response handlers把低层响应变成资源对象boto3/resources/response.py负责把低层 Client 返回的原始响应字典转换为资源实例或原样透传。4.1 build_identifiers标识符值装配build_identifiers(identifiers, parent, paramsNone, raw_responseNone)按标识符定义逐项取值source支持五种responsejmespath.search(identifier.path, raw_response)从低层响应中取。requestParameter从请求参数params中按 JMESPath 取。identifier从父资源取同名标识符。dataget_data_member从父资源数据取可能触发加载。input用户传入跳过。返回值是按(xform_name(target), value)排序的元组列表。若值为列表则代表响应是复数的多资源。4.2 RawHandler 与 ResourceHandler两种响应策略RawHandler仅做 JMESPath 搜索透传若search_path存在且不等于$则jmespath.search(search_path, response)返回原始字典。适用于不产生新资源的动作如queue.send_message返回原始响应。ResourceHandler从响应构造新资源。核心逻辑在__call__通过factory.load_from_definition加载目标资源类若定义了path用 JMESPath 从原始响应中提取资源属性数据存入meta.data用build_identifiers组装标识符字典若任一标识符是列表则响应为复数——以第一个列表的长度决定创建多少个实例并逐项从列表头部消费value.pop(0)非列表标识符对每个实例复用同一值若所有标识符均非空创建单个资源实例否则返回空值若发生过远程调用由build_empty_response依据服务模型 shape 类型决定返回{}structure、[]list或None。handle_response_item负责单个实例的构造把父资源的低层 client 透传给新资源kwargs[client] parent.meta.client并将提取到的resource_data挂到resource.meta.data。4.3 build_empty_response按 shape 类型生成空值build_empty_response(search_path, operation_name, service_model)从服务模型中取操作输出 shape沿搜索路径逐段下钻结构体取members[item]列表取member遇到其他类型抛NotImplementedError最后按type_name返回空结构体、空列表或None。这保证了资源不存在类场景下 API 返回值的类型一致性。五、Resource actions动作的三类执行器boto3/resources/action.py定义了动作的可调用封装它们被ResourceFactory挂到资源类上成为方法。5.1 ServiceAction单资源动作ServiceAction构造时根据动作模型是否定义resource决定响应处理器有则用ResourceHandler构造新资源无则用RawHandler。__call__的执行流程是将操作名转成 snake_casexform_name调create_request_parameters构建预填充参数再params.update(kwargs)允许用户覆盖从parent.meta.client取对应低层操作并调用交给响应处理器返回结果原始字典或资源实例。对应到用户侧sqs.get_queue_by_name(...)、s3.Bucket(foo).delete()都是ServiceAction。5.2 BatchAction集合批量动作BatchAction继承ServiceAction面向集合迭代器。其__call__遍历parent.pages()的每一页对页内每个资源用create_request_parameters(..., paramsparams, indexindex)累加参数然后调用一次批量操作。文档注释中的典型场景是一次删除多达 999 个 S3 对象而不是逐个.delete()。若某一页参数为空则提前break避免无意义的远程调用。返回值是每页低层响应字典组成的列表。SQS 的batchActions.DeleteDeleteMessageBatch即走此路径。5.3 WaiterAction等待器动作WaiterAction包装资源级等待器如s3.Bucket(foo).wait_until_bucket_exists()。它从parent.meta.client.get_waiter(client_waiter_name)取得低层等待器同样先create_request_parameters再wait(**params)。5.4 CustomModeledAction自定义注入动作CustomModeledAction用于把自定义建模动作注入资源例如 EC2 的delete_tags对应 ec2/createtags.py 与 ec2/deletetags.py 的机制。构造时接收动作名、JSON 定义、执行函数与事件发射器inject时构造Action模型、生成动作文档串ActionDocstring并通过inject_attribute把函数挂到类属性上。六、Resource base资源的元数据与基类boto3/resources/base.py提供ResourceMeta与ServiceResource。6.1 ResourceMeta资源元数据ResourceMeta保存service_name如s3、identifiers标识符名列表、client低层 Botocore 客户端、data已加载的资源属性数据与resource_model。它实现了__repr__、__eq__比较__dict__与copy()。6.2 ServiceResource一切资源的基类ServiceResource是所有资源的基类其meta类属性在实例化时通过self.meta.copy()拷贝避免影响同类其他实例。构造逻辑要点未显式传client时自动boto3.client(self.meta.service_name)标识符既支持按定义顺序的位置参数for i, value in enumerate(args)也支持关键字参数未知关键字抛ValueError构造后校验所有标识符均已设置缺失抛ValueError: Required parameter X not set__eq__要求同类且所有标识符值相等__hash__基于(类名, 标识符元组)。因此s3.Object(bucket, key)缺key会直接抛异常而两个s3.Bucket(same-name)实例相等。七、Resource factory从模型到类的代码生成器boto3/resources/factory.py的ResourceFactory负责把ResourceModel变成真正的ServiceResource子类。load_from_definition的流程与参考页Resource factory一节对应用 JSON 定义构造ResourceModel依据shape从服务模型取 shape调load_rename_map处理命名冲突构造ResourceMeta与类属性字典attrs依次加载标识符_load_identifiers→ 动作_load_actionsload与reload是特殊动作→ 属性_load_attributes→ 集合_load_collections→ 引用与子资源_load_has_relations→ 等待器_load_waiters类名形如s3.Bucket服务资源命名为ServiceResource基类为ServiceResource若配置了事件发射器发射creating-resource-class.{cls_name}事件允许注入自定义行为CustomModeledAction即借此挂载用type()动态创建类。各加载方法对应的属性形态标识符_create_identifier生成只读property默认返回None而非抛AttributeError便于实例化时给出更友好的校验错误。动作_create_action闭包共享ServiceActionload特殊之处在于把响应写入self.meta.data普通动作执行后则清空self.meta.data下次访问属性时重新加载。属性_create_autoload_property生成懒加载property——meta.data为空时先load()无load方法则抛ResourceLoadException再返回meta.data.get(name)。引用_create_reference懒求值支持循环引用needs_data标识符需要先加载数据。子资源_create_class_partial类似functools.partial把父实例的标识符值作为位置参数与低层 client 一起传给子资源类构造器实现sqs.Queue(foo).Message(bar)这种链式创建。集合_create_collection委托给CollectionFactory生成集合管理器属性。等待器_create_waiter包装WaiterAction为do_waiter方法。此外工厂还会为每个资源注入get_available_subresources()返回排序后的子资源名列表。八、结合使用一次调用的完整数据流把以上模块串起来一次典型调用sqs.get_queue_by_name(QueueNamemyqueue)的完整链路是sqs服务资源类由ResourceFactory.load_from_definition依据 SQS 资源定义 生成get_queue_by_name动作模型解析自service.actions.GetQueueByName请求操作GetQueueUrl响应资源QueueServiceAction.__call__调create_request_parameters预填充参数此处用户通过QueueName传入再调parent.meta.client.get_queue_url(...)响应交给ResourceHandlerbuild_identifiers从响应QueueUrl字段取出Url标识符load_from_definition生成Queue类并实例化path定义的数据挂到meta.data用户后续访问queue.attributes等属性时_create_autoload_property检测meta.data为空则触发GetQueueAttributes的load动作将结果缓存于meta.data。这一流程同时被tests/unit/docs/test_action.py、test_factory.py等单元测试见 tests/unit/docs和 guide/resources.rst 的用户指南所验证。九、延伸阅读与注意事项用户视角的完整教程见 Resources 指南其中覆盖标识符、属性、动作、引用、子资源、集合与等待器的使用方法与代码示例。各服务的实际资源定义 JSON 位于 boto3/data 下例如 S3 的 resources-1.json、EC2 的多版本定义可对照本文模型层理解字段语义。参考页 Resources reference 本身由 Sphinxautomodule自动抽取各模块 docstring 生成与本文对应的源码文件model.py、params.py、response.py、action.py、base.py、factory.py是权威的 API 细节来源。值得留意的是资源接口面向对象抽象自 Botocore Client若需要使用较新的服务功能官方指南建议直接使用 Client 接口资源接口在 Boto3 生命周期内保持兼容但不再增加新特性见 resources.rst 开篇说明。赞分享后端云原生【免费下载链接】boto3AWS SDK for Python (Boto3)项目地址https://gitcode.com/gh_mirrors/bo/boto3点击查看免费下载相关推荐Redux 核心 API 完全参考从 createStore 到 Store 方法的源码级解读Redux 核心 API 完全参考从 createStore 到 Store 方法的源码级解读 本篇指南以本仓库 docs/api 下的 API Refere前端Boto3 资源接口Resources完全指南从 Session 到对象的 AWS 高级抽象Boto3 资源接口Resources完全指南从 Session 到对象的 AWS 高级抽象 Boto3 的 Resources 接口为 AWS 提供了一后端云原生Salt 编排核心salt.state 状态选项完整参考与源码级解析Salt 编排核心salt.state 状态选项完整参考与源码级解析 导读 本文以 Salt 仓库中 Orchestrate Runner 文档 https:运维配置管理后端上一篇ByData Auto Bot核心功能揭秘多账号管理与代理支持全攻略下一篇AutoHotkey键盘响应测试评估键盘性能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表