【问题标题】:GAE timeout when query DNS查询 DNS 时 GAE 超时
【发布时间】:2013-11-15 04:39:43
【问题描述】:

我正在尝试使用脚本来检查电子邮件是否存在。为此,我正在使用 DNS 查询。这是失败的调用:

from dns import resolver
mx_data = resolver.query(hostname, 'MX', source='')

如果我使用 python 独立执行脚本,它可以工作,但是当它在本地或远程的 appengine 中运行时它会失败。堆栈跟踪:

File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1535, in __call__
  rv = self.handle_exception(request, response, e)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1529, in __call__
  rv = self.router.dispatch(request, response)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
  return route.handler_adapter(request, response)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1102, in __call__
  return handler.dispatch()
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 572, in dispatch
  return self.handle_exception(e, self.app.debug)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch
  return method(*args, **kwargs)
File "/Users/user/dev/gaeapp/request.py", line 5827, in get
  check2 = email_checker.validate_email(email)
File "/Users/user/dev/gaeapp/tools/email_checker.py", line 89, in validate_email
  mx_data = resolver.query(hostname, 'MX')
File "/Users/user/dev/gaeapp/dns/resolver.py", line 974, in query
  raise_on_no_answer, source_port)
File "/Users/user/dev/gaeapp/dns/resolver.py", line 894, in query
  timeout = self._compute_timeout(start)
File "/Users/user/dev/gaeapp/dns/resolver.py", line 734, in _compute_timeout
  raise Timeout

我遇到了与问题 DNS query using Google App Engine socket 类似的问题,但我尝试使用参数 source='' 调用查询但没有成功。

我使用的是 dnspython 1.11.1

更新:手动设置DNS解析器后生效:

r = resolver.Resolver()
r.nameservers = ['8.8.8.8', '8.8.4.4']
mx_data = r.query(hostname, 'MX')

【问题讨论】:

  • 一个明显的问题是您使用的是什么解析器?查看代码 resolver.query 将调用 get_default_resolver() 你确定了解析器列表是什么,如果从 appengine 的角度来看这些是有意义的?
  • @TimHoffman 这是一个很好的观点。我已将 Google DNS 服务器添加为解析器,并且可以正常工作。

标签: python google-app-engine sockets dns


【解决方案1】:

正如蒂姆所说,您需要明确设置解析器。

示例代码:

import dns.resolver

resolver = dns.resolver.Resolver()
resolver.nameservers = ['8.8.8.8']
mx_data = resolver.query(hostname, 'MX')

请注意,8.8.8.8 是 google 的 dns 服务器,但也可以是其他任何服务器。

另外请注意,您不需要设置 source=''

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多