如何在单独的线程Python中启动模拟HTTP服务器?

时间:2012-09-16 11:27:21

标签: python mocking python-2.7 bottle

我正在尝试在我的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..."

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

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

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

1 个答案:

答案 0 :(得分: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 -- sleeps thread or process?中所看到的,执行time.sleep只会睡眠当前正在运行的线程,因此您可以留出足够的时间来启动服务器线程。

现在,所有这些都是有点hackish,所以你可能想要查看你的服务器启动过程,看看是否有办法评估它是否正常运行并在启动之前等待这个条件。

现在看一下瓶子来源,我无法找到一个干净利落的解决方案;你总是可以尝试重复点击服务器直到它最终响应,从而表明服务器还活着。