Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在WSGI服务器上使用动态/临时服务器侦听套接字?_Python_Sockets_Wsgi - Fatal编程技术网

Python 如何在WSGI服务器上使用动态/临时服务器侦听套接字?

Python 如何在WSGI服务器上使用动态/临时服务器侦听套接字?,python,sockets,wsgi,Python,Sockets,Wsgi,我想部署一个Python应用程序,这样就可以在127.0.0.1/::1上启动内部Web服务器,无论当时哪个端口是空闲的。然后,它应该启动一个带有指向本地AdhocWeb服务器的URL的web浏览器 我现在的问题是:是否有任何WSGI web服务器允许动态地将它们绑定到一个空闲端口,然后让程序可以选择端口号?或者我可以自己创建一个侦听套接字,然后将其交给WSGI服务器使用吗?使用: 使用:可能有一种更简单的方法,但这种方法有效: import threading, time, cheroot.w

我想部署一个Python应用程序,这样就可以在127.0.0.1/::1上启动内部Web服务器,无论当时哪个端口是空闲的。然后,它应该启动一个带有指向本地AdhocWeb服务器的URL的web浏览器

我现在的问题是:是否有任何WSGI web服务器允许动态地将它们绑定到一个空闲端口,然后让程序可以选择端口号?或者我可以自己创建一个侦听套接字,然后将其交给WSGI服务器使用吗?

使用:

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

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来获取Web服务器的端口号。但就我而言,一个简单的_服务器就足够了。非常感谢你的帮助!我的理解是,在创建web服务器之后和进入服务器的服务循环之前启动web浏览器就足够了:侦听套接字已经创建,因此如果web浏览器现在连接,它不会接收到被拒绝的连接,但将保持在线,直到典型的连接超时>30秒左右服务器开始服务。我想这就足够了,但只有时间会告诉我们:先导入webbrowser,然后再导入webbrowser.open_new_选项卡'http://{}:{}/'.formatwebserver.server_address[0],webserver.server_address[1],在更多的现场经验之后,有时web浏览器出现得太快,没有显示任何错误,也没有页面。现在,我的补救办法是启动一个守护进程线程,该线程在发送给用户的webbrowser之前尝试从Web服务器获得成功响应。这确保了Web服务器的响应性。这似乎涵盖了那些罕见的角落案例。
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()