gpt4 book ai didi

python - Flask 开发服务器重新加载时向前端发送消息

转载 作者:行者123 更新时间:2023-12-03 16:25:01 25 4
gpt4 key购买 nike

我想在服务器重新加载时发送一个服务器发送事件来更新前端。我知道您可以通过设置 FLASK_ENV=development 自动重新加载 Flask。是否有类似“onServerReload”的回调在服务器刷新之前或之后调用?

最佳答案

不是真正的解决方案,但评论时间太长...

Flask 实际上使用了 Werkzeug 的重新加载器。这是短语 * Detected change in '/chat/app.py', reloading 被打印出来的地方:werkzeug/_reloader.py

为此设置一个钩子(Hook)的想法,似乎很久以前就在 issue 14 中讨论过了。和 issue 220但从未实现。论据似乎是当应用程序实际重新加载时,整体再次运行,所以:

from flask import Flask
app = Flask(__name__)
print ('I have been reloaded')
# Rest of file

重新加载结果:

 * Detected change in '/chat/app.py', reloading
* Restarting with stat
I have been reloaded

您可能会在此处放置一些向流发送内容的代码,并将其包装在 if 子句中以确保它仅在开发中运行。如何实际实现可能取决于您已经拥有的东西。


我克隆了这个仓库:github.com/jakubroztocil/chat这是 SSE 的基本实现,以 redis pub/sub 作为代理,看起来像:

red = redis.StrictRedis(host='redis')
# This will happen on init
red.publish('chat','Just Reloaded')

但是我遇到的问题是,当我发布“Just Reloaded”消息时,因为应用程序处于重新加载状态,所以该 channel 没有订阅者(订阅发生在 event_stream() 当有人点击 /stream 路由时调用的函数。)

如果您通过保存对代码的更改来激活重新加载程序,并观察浏览器的网络选项卡,您将看到第一个流关闭,并且在几秒钟内另一个流打开到同一端点。发布命令发生在这些点之间,因此从未到达前端。这是我理解的 redis 限制。

一个解决方法可能是有一个专用的 flask 服务器,它只处理事件流,并订阅一个 redis channel ,开发中的应用程序也可以发布到该 channel 。然后,开发中的应用程序从它们的前端连接到该流,并且在代码重新加载时订阅不会中断,因为它由专用的 flask 实例提供服务。如果每个服务器在不同的端口上访问,浏览器可能会提示。

关于python - Flask 开发服务器重新加载时向前端发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58921315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com