我正在尝试使用 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']
有两件事让我感到困惑(它们是相关的):
最佳答案
到目前为止,我还没有查看过 dns.resolver
- 我只是将其添加到了不断增长的待检查列表中。我猜测 rdata 指的是资源记录类型特定数据,如 Section 4.1.3 of RFC1035 中所述。 。 DNS 请求的响应除了查询和 header 之外还包含三个数据部分:
- 答案
- 权威名称服务器记录
- 其他资源记录
从表面上看,dns.resolver.query()
正在返回第一部分。在这种情况下,答案部分中的每个资源记录将根据记录类型具有不同的属性。在本例中,您请求 MX
记录,因此这些记录应该具有您所拥有的完全相同的属性 - exchange
和 preference
。这些在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/