0

我在我的脚本中使用 urllib2.py 将文件发布到网络服务器,并且一直超时。我的代码:

def postdata(nodemac,filename,timestamp):
    try:
        wakeup()
        socket.setdefaulttimeout(TIMEOUT)
        opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler)
        host = HOST
        func = "post_data"
        url = "http://{0}{1}?f={2}&nodemac={3}&time={4}".format(host, URI, func, nodemac, timestamp)
        if os.path.isfile(filename):
            data = {"data":open(filename,"rb")}
            response = opener.open(url, data, timeout=TIMEOUT)
            retval = response.read()
            if "SUCCESS" in retval:
                return 0
            else:
                print "RETVAL "+retval
                return 99
        else:
            print filename +" is not a file"
            return 99
    except Exception as e:
        print e
        return 99

我将 TIMEOUT 设置为 20、60 和 120,但同样的事情一直在发生。我想知道这是怎么回事?有什么不对劲!超时设置为 20 过去可以正常工作,然后突然之间,今天它开始对我超时......有人有任何线索吗?我在网上找不到任何能让我更进一步的东西,所以我想我会在这里尝试......!

谢谢,

追溯:

 File "gateway.py", line 686, in CloudRun
    read_img()
  File "gateway.py", line 668, in read_img
    retval = database.postimg(mac,fh,timestmp)
  File "/root/database.py", line 100, in postimg
    response = opener.open(url, data, timeout=TIMEOUT)
  File "/usr/lib/python2.7/urllib2.py", line 394, in open
  File "/usr/lib/python2.7/urllib2.py", line 412, in _open
  File "/usr/lib/python2.7/urllib2.py", line 372, in _call_chain
  File "/usr/lib/python2.7/urllib2.py", line 1199, in http_open
  File "/usr/lib/python2.7/urllib2.py", line 1174, in do_open
URLError: <urlopen error timed out>
4

1 回答 1

0

超时设置为 20 过去可以正常工作,然后突然之间,今天它开始对我超时......有人有任何线索吗?

嗯,第一个线索是即使你的代码没有改变行为。所以,它必须与环境有关。

最可能的可能性是超时是服务器超载、损坏等的一个完全准确的信号。但是,由于您根本没有向我们提供有关您尝试与之交谈的服务器的任何信息,因此很难做更多比猜测。

这里有一些用于追踪问题的想法。

首先,获取完全相同的 URL,将其粘贴到浏览器的地址栏中,然后看看会发生什么。是否超时?或者需要超过 20 秒的时间来响应?

尝试添加&data=data到 URL 的末尾。

尝试使用简单的工具将请求作为 POST 发送。例如,从命令行尝试curl -d data http://whatever.

尝试准确记录urllib2使用的标题和发布数据,并curl发送完全相同的内容。(如果这失败了,而前一个有效,您可能想要编辑您的问题,或提出一个新问题,“为什么这个工作和那个失败?”以及详细信息。)

尝试从具有不同 Internet 连接的不同计算机上运行相同的测试。

于 2013-05-18T00:27:49.677 回答