【问题标题】:How to use dynamic/adhoc server listening socket with WSGI servers?如何在 WSGI 服务器上使用动态/adhoc 服务器监听套接字?
【发布时间】:2018-10-22 08:12:54
【问题描述】:

我想部署一个 Python 应用程序,然后可以在 127.0.0.1/::1 上的任何端口上启动一个内部网络服务器,当时任何端口都是空闲的。然后它应该启动一个带有指向本地 adhoc Web 服务器的 URL 的 Web 浏览器。

我现在的问题是:是否有任何 WSGI Web 服务器允许将它们动态绑定到空闲端口,然后使所选的端口号对程序可用?或者我可以自己创建一个监听socket,然后交给WSGI服务器使用?

【问题讨论】:

    标签: python sockets wsgi


    【解决方案1】:

    使用wsgiref.simple_server:

    import wsgiref.simple_server
    your_app = wsgiref.simple_server.demo_app
    server = wsgiref.simple_server.make_server('127.0.0.1', 0, your_app)
    _, port = server.server_address
    # start the browser, perhaps on a separate thread after a delay
    server.serve_forever()
    

    使用Cheroot:可能有更简单的方法,但这种方法可行:

    import threading, time, cheroot.wsgi
    server = cheroot.wsgi.Server(('127.0.0.1', 0), your_app)
    def get_port():
        while not server.ready:
            time.sleep(0.1)
        _, port = server.bind_addr
        # start the browser
    threading.Thread(target=get_port).start()
    server.start()
    

    【讨论】:

    • 所以没有通用的 API 来获取网络服务器的端口号。但就我的目的而言,simple_server 就足够了。非常感谢您的帮助!
    • 我的理解是,在创建 Web 服务器之后和进入服务器的服务循环之前启动 Web 浏览器就足够了:监听套接字已经创建,所以如果 Web 浏览器现在连接,它不会收到拒绝的连接,但会保持在线状态,直到(典型的连接超时 > 30 秒左右)服务器开始提供服务。我怀疑这已经足够了,但只有时间会证明:import webbrowser 然后webbrowser.open_new_tab('http://{}:{}/'.format(webserver.server_address[0], webserver.server_address[1]))
    • 经过一些实地体验后,有时网页浏览器启动速度过快,不显示任何错误,但也没有页面。我现在的补救措施是启动一个守护线程,该线程尝试在传递给用户的网络浏览器之前从网络服务器获得成功的响应。这确保了网络服务器是响应式的。这似乎涵盖了那些罕见的极端情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2017-05-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多