使用套接字时的 Flask 调试模式

jan*_*ybs 6 python sockets flask flask-socketio

我正在构建使用套接字(flask socketio)的python Flask应用程序。基本上,客户端会向服务器发送一些他想要执行的命令。服务器将执行命令并将套接字发送到客户端命令输出。

有接收用户请求的处理函数。此函数将执行命令并将大量套接字发送回客户端。还使用了获取 stdout 和 stderr 线程。

@socket.on ('run-code')
@authenticated_only
def socket_run_code_request (request):
  # run command
  # emit socket for each line of output
Run Code Online (Sandbox Code Playgroud)

如果flask app 处于调试模式,函数内部发出的套接字将在函数结束之前到达客户端(这是可取的)。但是如果调试关闭,所有套接字都会以某种方式排队并在函数结束后发送。没有来自服务器的实时响应,只是

单击执行->稍等->这是您的输出

代替:

单击执行->这是一些输出->这是另一行-> ...

我读过瓶文档,但说明调试以下

如果您启用调试支持,服务器将在代码更改时重新加载自己,如果出现问题,它还将为您提供有用的调试器

有没有办法告诉 Flask 立即发送所有内容,或者一些如何解决这个问题的想法?它可能与flask的flask-socketio插件有关

非常感谢您的反馈:)

Mig*_*uel 3

我的猜测是,问题在于您没有对标准库进行猴子修补,因此您为支持异步进程的监视而进行的所有这些调用都会被阻塞。在调试模式下,Flask-SocketIO 会进行猴子修补,因为如果没有它,Flask 重新加载器将无法工作。

要进行猴子补丁,只需在主 Python 脚本的最顶部添加以下内容:

from gevent import monkey
monkey.patch_all()
Run Code Online (Sandbox Code Playgroud)