Python httplib名称或服务未知。

9

我正在尝试使用httplib将信用卡信息发送到authorize.net。当我尝试提交请求时,会出现以下回溯:

File "./lib/cgi_app.py", line 139, in run res = method()
File "/var/www/html/index.py", line 113, in ProcessRegistration conn.request("POST", "/gateway/transact.dll", mystring, headers)
File "/usr/local/lib/python2.7/httplib.py", line 946, in request self._send_request(method, url, body, headers)
File "/usr/local/lib/python2.7/httplib.py", line 987, in _send_request self.endheaders(body)
File "/usr/local/lib/python2.7/httplib.py", line 940, in endheaders self._send_output(message_body)
File "/usr/local/lib/python2.7/httplib.py", line 803, in _send_output self.send(msg)
File "/usr/local/lib/python2.7/httplib.py", line 755, in send self.connect()
File "/usr/local/lib/python2.7/httplib.py", line 1152, in connect self.timeout, self.source_address)
File "/usr/local/lib/python2.7/socket.py", line 567, in create_connection raise error, msg
gaierror: [Errno -2] Name or service not known

我这样构建我的请求:

mystring = urllib.urlencode(cardHash)
headers = {"Content-Type": "text/xml", "Content-Length": str(len(mystring))}
conn = httplib.HTTPSConnection("secure.authorize.net:443", source_address=("myurl.com", 443))
conn.request("POST", "/gateway/transact.dll", mystring, headers)

为了给这个问题增加另一层面,它在我们的开发服务器上正常运行,该服务器具有httplib 2.6版本并且没有使用httplib.HTTPSConnection中的source_address参数。
非常感谢任何帮助。
===========================================================
编辑:
我可以从命令行运行它。 显然这是某种权限问题。 有什么想法,我需要授予哪些用户哪些权限才能使这种情况发生? 可能Apache无法打开端口?

一个没有请求头的GET请求,相同路径会发生什么? - TryPyPy
与帖子上的一样。 - Chris
嗯,在这里脚本运行良好,甚至如果我打印响应,可以到达“商家登录ID或密码无效或帐户不活动。” 着重于网络问题。 - TryPyPy
4个回答

19

作为一个(显而易见的)提醒,同样可以通过在主机参数中包含协议来触发此错误。例如,以下代码:

conn = httplib.HTTPConnection("http://secure.authorize.net", 80, ....)  

即使您的网络设置正确,这也会导致“gaierror: [Errno -2] Name or service not known”错误。


8

gaierror: [Errno -2] 名称或服务未知

这个错误通常表示您的DNS解析器失败了。您是否可以从接收gaierror的同一服务器成功地ping通secure.authorize.net?主机名是否有拼写错误?


ping 返回一个“数据包被过滤”消息并失败。我认为这是因为它受到了安全保护,只接受端口 443。此时我收到一个“权限被拒绝”的消息。我不确定这是前进还是倒退的一步。 - Chris
Chris,我可以成功地ping通secure.authorize.net。nslookup secure.authorize.net会告诉你什么? - Don Spaulding
服务器:192.168.3.1 地址:192.168.3.1#53非权威回答: 名称:secure.authorize.net 地址:64.94.118.33 名称:secure.authorize.net 地址:64.94.118.32 - Chris

1
问题最终归结为selinux阻止了apache获取该端口。禁用selinux解决了问题。后来我遇到了一个问题,即我没有/var/www/.python-eggs/,因此在导入时MySQLdb出现了问题。但是经过mkdir之后,问题得到了解决。

0

将端口与主机分开传递:

conn = httplib.HTTPSConnection("secure.authorize.net", 443, ....)  

返回的错误信息是:“错误:[Errno13]权限被拒绝”。我的源地址应该是什么?它可以只是“www.mydomain.com”,还是应该是“http://www.mydomain.com/mypy.py”?这有关系吗? - Chris
“Permission Denied” 实际上是由于我更改了源地址所致。将 URL 和端口分开似乎没有任何区别。 - Chris
你的意思是什么?现在你不再遇到“gaierror: [Errno -2] Name or service not known”的错误了,但出现了另一个错误? - nosklo
现在我遇到了“权限被拒绝”的错误。我认为Apache没有权限使用那个端口或者其他什么问题。 - Chris
1
@Chris:你能否更新问题,附上更新后的代码和完整的新错误回溯信息? - nosklo
1
我们最终解决了问题。代码没问题。问题归根结底是selinux阻止了apache获取该端口。禁用selinux解决了问题。后来我遇到了一个问题,就是没有/var/www/.python-eggs/目录,所以在导入MySQLdb时出现了问题。但是创建一个mkdir之后,问题得到了解决。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接