1

我试图在我的 python 脚本中模拟一个 HTTP 服务器,但它失败了。这是我正在做的事情:

import bottle
from restclient import GET
from threading import Thread

@bottle.route("/go")
def index():
    return "ok"


server = Thread(target = bottle.run)
server.setDaemon(True)
server.start()

print "Server started..."

response = GET("http://127.0.0.1:8080/go")

assert response.body == "ok"

print "Done..."

基本上我试图在一个单独的线程中启动bottle.py http服务器和1个测试路由,然后模拟它的响应。

但它只是行不通。服务器没有在单独的线程中启动,因此在尝试请求它时我总是得到“errno 111 connection denied”。

所以问题是:如何解决?还有其他方法可以模拟 http 服务器吗?

4

1 回答 1

7

您没有留出足够的时间让网络服务器启动。

当你这样做时:

server.start()
print "Server started..."
response = GET("http://127.0.0.1:8080/go")   

您尝试在启动服务器后访问它,

根据哪个线程(主线程或服务器线程)首先运行(以及运行多长时间),当您尝试访问它时,您可能会遇到服务器尚未启动的情况,因此会Connection Refused出现错误.

您可以尝试执行以下操作:

server.start()
import time
time.sleep(...) # Something long enough
# Continue your stuff.

正如您在time.sleep 中看到的那样——睡眠线程或进程?,doingtime.sleep只会休眠当前正在运行的线程,因此您可以为服务器线程留出足够的时间来启动。

现在,所有这一切都有些骇人听闻,因此您可能想查看您的服务器启动过程,看看是否有办法评估它是否已启动并运行,并在启动前等待这种情况。

现在看看瓶子来源,我想不出一个干净的解决方案;您总是可以尝试反复访问服务器,直到它最终响应,从而表明服务器处于活动状态。

于 2012-09-16T11:34:38.337 回答