是否可以在Flask中动态更新服务器端渲染的模板?
我现在有一个Flask网络服务器,它通过内置的请求对象从一个JSON API获取数据。
举个例子:
def get_data():
response = requests.get("http://myhost/jsonapi")
...
return response
@main.route("/", methods=["GET"])
def index():
return render_template("index.html", response=response)
这里的问题是,GET方法只会在第一次调用get_data时运行一次。为了刷新数据,我必须停止并重启Flask的wsgi服务器。我尝试把代码的不同部分放在一个while True / sleep循环里,但这样会导致werkzeug无法加载页面。
那么,有什么更好的Python方式可以动态获取我想要的数据,而不需要重新加载页面或重启服务器呢?
2 个回答
为了补充Jonathan的评论,你可以使用像stimulus或turbo links这样的框架来动态实现这个功能。在某些情况下,你甚至不需要写JavaScript,因为这些框架已经帮你处理了很多复杂的事情。https://stimulus.hotwired.dev/handbook/origin
你在讨论的可能是两个不同的问题。
首先,假设你的问题是你只调用了一次动态数据源
get_data()
,并把它的(静态)值保存在一个全局变量response
中。虽然这个一次性调用没有显示出来,但我们假设它在你的代码的某个地方。然后,如果你愿意刷新页面(/
)来获取更新的数据,你可以这样做:@main.route("/", methods=['GET']) def index(): return render_template("index.html", response=get_data())
这样每次加载页面时都会获取最新的数据。
接着在你问题的最后,你问如何“获取我想要的数据而不需要重新加载页面或重启服务器”。这完全是另一个问题。你需要在代码中使用 AJAX 或 WebSocket 请求。关于如何做到这一点有很多教程(比如这个),你可以通过搜索“Flask AJAX”找到。但这需要用到 JavaScript 的 AJAX 调用。我建议你搜索“Flask AJAX jQuery”的例子,因为 jQuery 会让你在客户端的操作变得更简单明了。或者,如果你想使用 WebSocket 来实现网页之间更低延迟的连接,这也是可以的;你可以搜索一些例子(比如 像这个)。