我的环境是Windows 10上的Python 3.7。我正在开发(非常)轻量级的HTTP服务器应用程序,其主要目的是测试执行HTTP POST请求的移动计算机应用程序。我已经找到Python文档和其他一些资料来解释使用http.server
模块的基础知识,因此,不费吹灰之力就能获得运行正常的服务器。
尽管有一个细节,我很难。通过实验,我发现HTTPServer
实例不会等到您调用serve_forever()
方法开始监听。相反,实例化实例后,它将立即开始在指定端口上侦听。如果您尝试(例如)这个小脚本:
import time
from http.server import BaseHTTPRequestHandler,HTTPServer
class MyHandler(BaseHTTPRequestHandler):
def do_POST(self):
pass
h1 = HTTPServer(('', 10123), MyHandler)
print('Server instantiated')
while (True):
time.sleep(0.1)
pass
它只实例化服务器,但是在本地计算机上的检查显示该脚本导致端口10123被绑定并在以下端口监听:
C:\Dev_Python\HTTPServer>netstat -anp tcp
Active Connections
Proto Local Address Foreign Address State
TCP 0.0.0.0:10123 0.0.0.0:0 LISTENING
我在进一步搜索文档时发现,我可以通过访问类的socket
对象来“撤消”此监听:
h1.socket.close()
...但是我希望服务器从一开始就没有开始监听,直到我希望它真正开始监听为止。
所以问题是:是否有一种方法可以覆盖此行为,并在延迟其侦听端口的同时实例化服务器?
有bind_and_activate关键字参数,默认值为True,它使您可以控制新创建的袜子式绑定和激活。
尝试:
...
h1 = HTTPServer(('', 10123), MyHandler, bind_and_activate=False)
...
您可以稍后绑定并激活它:
...
try:
h1.server_bind()
h1.server_activate()
except:
h1.server_close()
raise
...