python - dnspython 和 python 对象

标签 python dns dnspython

我正在尝试使用 dnspython 库,并且对此页面上查询 MX 记录的示例感到有点困惑:www.dnspython.org/examples.html:

import dns.resolver

answers = dns.resolver.query('dnspython.org', 'MX')
for rdata in answers:
    print 'Host', rdata.exchange, 'has preference', rdata.preference

在 python CLI 中,dir(answers) 给了我:

['__class__', '__delattr__', '__delitem__', '__delslice__', '__dict__', '__doc__', '__getattr__', '__getattribute__', '__getitem__', '__getslice__', '__hash__', '__init__', '__iter__', '__len__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'expiration', 'qname', 'rdclass', 'rdtype', 'response', 'rrset']

有两件事让我感到困惑(它们是相关的):

  • 对答案对象进行迭代。示例中的 rdata 是什么?
  • 答案的属性或方法均不匹配交换或偏好。显然 rdata 不仅仅是答案的简单别名,但我不明白这些属性来自哪里。
  • 最佳答案

    到目前为止,我还没有查看过 dns.resolver - 我只是将其添加到了不断增长的待检查列表中。我猜测 rdata 指的是资源记录类型特定数据,如 Section 4.1.3 of RFC1035 中所述。 。 DNS 请求的响应除了查询和 header 之外还包含三个数据部分:

    1. 答案
    2. 权威名称服务器记录
    3. 其他资源记录

    从表面上看,dns.resolver.query()正在返回第一部分。在这种情况下,答案部分中的每个资源记录将根据记录类型具有不同的属性。在本例中,您请求 MX 记录,因此这些记录应该具有您所拥有的完全相同的属性 - exchangepreference。这些在Section 3.3.9 of RFC1035中进行了描述。 .

    我怀疑 dns.resolver 正在覆盖 __getattr__ 或类似的东西来执行您所看到的魔法,因此您不会直接在 中看到字段>dir()。您很可能可以安全地使用 RFC1035 中定义的属性。我明天肯定要检查一下,因为我需要一个像样的 Python DNS 子系统。

    感谢您提及此模块,祝您使用 DNS 愉快。如果你真正深入研究它是如何工作的,这确实是非常有趣的东西。我仍然认为这是当今风靡一时的 Restful 事物的早期表达方式之一;)

    关于python - dnspython 和 python 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/885634/

    相关文章:

    php - 如何制作国家/地区特定网站(和内容)?

    python - DNSSEC 使用 DNSPython 对 RRSET 进行签名

    python-3.x - dnspython3 从 A 记录中删除主机

    python - 我如何让python将瑞典语字母(åäö)写入html文件?

    Heroku 上的 Python。记录选项?

    python - 如何使用 ipaddress 模块从 192.168.0.0/24 网络中分割出最后 11 个 IP?

    Oracle RAC VIP 和 SCAN IP

    python - 将 xarray.apply(np.nansum) 与 args 一起使用

    linux - 在 Linux Mint 17.1 上清除 Firefox Developer Edition DNS 缓存