您可以在不监听的情况下实例化Python HTTP服务器吗?

问题描述 投票:0回答:1

我的环境是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()

...但是我希望服务器从一开始就没有开始监听,直到我希望它真正开始监听为止。

所以问题是:是否有一种方法可以覆盖此行为,并在延迟其侦听端口的同时实例化服务器?

python-3.x httpserver
1个回答
0
投票

bind_and_activate关键字参数,默认值为True,它使您可以控制新创建的袜子式绑定和激活。

尝试:

...
h1 = HTTPServer(('', 10123), MyHandler, bind_and_activate=False)
...

您可以稍后绑定并激活它:

...
try:
    h1.server_bind()
    h1.server_activate()
except:
    h1.server_close()
    raise
...
© www.soinside.com 2019 - 2024. All rights reserved.