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

geC*_*der 1 python mocking bottle python-2.7

我试图在我的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..."
Run Code Online (Sandbox Code Playgroud)

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

但它不会起作用.服务器没有在一个单独的线程中启动,所以我总是在尝试请求时得到"errno 111 connection refused".

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

Tho*_*zco 7

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

当你这样做时:

server.start()
print "Server started..."
response = GET("http://127.0.0.1:8080/go")   
Run Code Online (Sandbox Code Playgroud)

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

根据哪个线程(主线程或服务器线程)首先运行(以及运行多长时间),最终可能会在服务器尚未启动时尝试访问它,从而导致Connection Refused错误.

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

server.start()
import time
time.sleep(...) # Something long enough
# Continue your stuff.
Run Code Online (Sandbox Code Playgroud)

正如你在time.sleep中看到的那样- 睡眠线程还是进程?,执行time.sleep只会睡眠当前正在运行的线程,因此您可以留出足够的时间来启动服务器线程.

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

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