是否可以在Flask中动态更新服务器端渲染的模板?

18 投票
2 回答
37520 浏览
提问于 2025-04-29 08:07

我现在有一个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 个回答

0

为了补充Jonathan的评论,你可以使用像stimulus或turbo links这样的框架来动态实现这个功能。在某些情况下,你甚至不需要写JavaScript,因为这些框架已经帮你处理了很多复杂的事情。https://stimulus.hotwired.dev/handbook/origin

17

你在讨论的可能是两个不同的问题。

  1. 首先,假设你的问题是你只调用了一次动态数据源 get_data(),并把它的(静态)值保存在一个全局变量 response 中。虽然这个一次性调用没有显示出来,但我们假设它在你的代码的某个地方。然后,如果你愿意刷新页面(/)来获取更新的数据,你可以这样做:

    @main.route("/", methods=['GET'])
    def index():
        return render_template("index.html", response=get_data())
    

    这样每次加载页面时都会获取最新的数据。

  2. 接着在你问题的最后,你问如何“获取我想要的数据而不需要重新加载页面或重启服务器”。这完全是另一个问题。你需要在代码中使用 AJAX 或 WebSocket 请求。关于如何做到这一点有很多教程(比如这个),你可以通过搜索“Flask AJAX”找到。但这需要用到 JavaScript 的 AJAX 调用。我建议你搜索“Flask AJAX jQuery”的例子,因为 jQuery 会让你在客户端的操作变得更简单明了。或者,如果你想使用 WebSocket 来实现网页之间更低延迟的连接,这也是可以的;你可以搜索一些例子(比如 像这个)。

撰写回答