dnspython 2.1弃用dns.query.xfr后如何通过区域传输获取目标Zone对象
dnspython 2.1+ 域传送获取Zone对象的实现方案
旧版dns.zone.from_xfr(dns.query.xfr(...))的写法在2.1版本后因为接口拆分被重构。调整后入向域传送的逻辑不再返回可直接被from_xfr消费的原始流,要求调用方先传入一个初始化完成的空Zone对象作为事务载体,传送过程中会自动把解析记录填充到这个对象里。
核心实现逻辑
- 初始化空Zone对象时,唯一必填参数是目标域的根名称(origin),不需要提前手动写入任何解析记录
- 初始化时建议和旧版行为对齐,域名末尾补充代表根相对标记的点,避免相对域解析偏差
- 传送流程完成后,得到的Zone对象和旧版接口完全兼容,后续遍历节点、读取记录的代码不需要做任何修改
可直接替换的代码
import dns.zone import dns.query import dns.name name_server = 'oo.abc.com.' dns_zone = 'xx.abc.com.' # 末尾补点与旧版解析行为保持一致 # 初始化空Zone对象,作为inbound_xfr的事务管理器入参 zone = dns.zone.Zone(origin=dns.name.from_text(dns_zone)) # 执行入向域传送,自动完成全量记录加载 dns.query.inbound_xfr(name_server, zone)
常见踩坑提示
- 不要把名称服务器地址填到Zone的
origin参数里,该参数只需要填要传送的目标域本身 - 旧版写法如果域名没带末尾的点,新版本迁移时统一补上点,避免dnspython默认相对域规则导致的解析偏差
- 新方法相比旧版内置了传送过程的事务校验,遇到截断、DNSSEC校验失败等异常时会自动回滚,不会生成半加载的无效Zone对象
内容的提问来源于stack exchange,提问作者Neil Yuki
相关产品推荐
相关产品推荐

