我试图在我的 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 连接被拒绝”。
那么问题是:如何解决?还有其他方法可以模拟 http 服务器吗?
请您参考如下方法:
您没有为网络服务器的启动留出足够的时间。
当你这样做时:
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 只会休眠当前正在运行的线程,因此您可以为服务器线程留出足够的时间来启动。
现在,所有这些都有些老套,所以您可能想查看您的服务器启动过程,看看是否有一种方法可以评估它是否已启动并正在运行,并在启动之前等待这种情况。
现在查看 bottle 源,我想不出一个解决方案来干净地做到这一点;您总是可以尝试反复访问服务器,直到它最终响应,从而表明服务器处于事件状态。
