render_template in Flask on JS click event
我试图通过单击一个按钮来调用flask中的函数。单击按钮时,将运行以下脚本。
JS
1 2 3
| $("#load_btn").click(function() {
$.get("/callback");
} |
瓶
1 2 3 4 5
| @app.route('/callback')
def callback():
print('called')
... # code here that needs to run before rendering callback
return render_template('callback.html') |
这里的问题是,called被打印出来,GET /callback HTTP/1.1 200也被记录下来,但是callback.html没有被呈现出来——页面保持不变。我猜这可能不是解决这个问题的最佳方法,但是如果是,推荐的方法是什么?
$.get只是向您的服务器发送一个HTTP请求,但实际上它对从服务器返回的数据(在您的情况下,是呈现的模板)没有做任何处理。
尝试如下操作:
1 2 3
| $("#load_btn").click(function() {
$("html").load("/callback");
} |
或者,如果呈现的模板不包含任何标记,只包含正文内容,则可以这样做。
1 2 3
| $("#load_btn").click(function() {
$("body").load("/callback");
} |
或者,可以将"body"替换为特定元素,以仅替换页面的特定部分。
如果要重定向用户,请执行以下操作:
1 2 3
| $("#load_btn").click(function() {
window.location ="/callback";
} |
- 这将替换当前页中的内容。我希望用户被重定向到mysite.com/callback,并为该页面呈现callback.html,如果这有意义的话。我之所以通过flask应用程序发送它而不直接在HTML中加载它,是因为我需要在回调中运行一个函数。
- 我已经更新了我的答案
- 谢谢,这会更改URL,但它仍然不能解决我的问题。我希望重定向发生在执行callback方法中的代码之后(我在原来的文章中用...表示)。
- 是的,就是这样。当用户单击#load_btn元素时,将调用click处理程序,这将更改URL。浏览器从服务器获取此URL的内容。然后,您的callback函数中的任何代码都会运行。然后,呈现模板,并将响应发送到浏览器。
- 不能在callback函数运行后进行重定向,因为运行回调函数的唯一方法是转到url /callback。
- 哦,好的,明白了。不过,回调中的进程是一个长期运行的函数。我有一个进度条,理想情况下我希望在回调中的代码运行时进行更新,但是如果我调用window.location,它将不会运行。有办法吗?
- HTTP是一种基于请求和响应的非常简单的协议。所以当用户转到/callback时,回调函数只能发送一个响应。有几种方法可以做到这一点,但最简单的方法是让callback函数在后台线程中运行长时间运行的任务,然后立即返回包含进度条的响应模板。然后,该页面需要向服务器发送请求(使用$.get请求进度)。您将创建一个类似于/callback_progress的flask路由来返回这些信息。