我正在执行Ajax调用以执行python脚本。我正在使用flask框架来这样做。它转到URL,执行脚本并返回响应。但是,python脚本可能需要大约10秒钟才能执行并返回响应。直到那时,如果用户关闭或重新加载选项卡,ajax调用和脚本执行都会被中断。当然,我不要那个。因此,我正在寻找替代方案或任何建议,以便在服务器运行之前,即使关闭或重新加载选项卡,python脚本执行也应完成。
烧瓶文件:
@app.route('/<contest_id>/<task_id>/submit')
def submit(contest_id, task_id):
response = os.popen("python3 static/submit.py "+contest_id+" "+task_id).read()
return response
Ajax调用:
$.ajax({
type: "GET",
url: "/"+contest_id+"/"+task_id+"/submit",
success: function(response) {
// do something
}
});
答案 0 :(得分:0)
您可以使用beacon。它保证页面关闭不会终止它(尽管如果您关闭浏览器本身也会终止)。但是,另一方面,您将不会收到对脚本的响应。通常只用于只写请求,不需要在客户端进行确认或其他数据。
navigator.sendBeacon(url, data);
但是,do not support it仍然有几种浏览器。
如果您需要回复,则除了AJAX(或页面转换)之外别无选择。
但是,您的submit
作业不应被终止。当然,如果用户浏览了您的页面,您将不会得到响应,但是flask将完成工作。试试这个:
import time
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
with open('woo1', 'w') as w: pass
time.sleep(60)
with open('woo2', 'w') as w: pass
return "Hello World!"
导航至http://localhost:5000,然后在分钟结束前导航;一分钟后,您应该在目录中同时找到woo1
和woo2
。
答案 1 :(得分:0)
针对此类问题的常见解决方案是使用Celery
。使用celery,您可以运行异步任务,而无需等待结果。它基本上是用于在后台运行任务的队列。您可以启动任务并等待其完成。即使关闭浏览器,任务也将继续运行。使用正确的配置,您可以将结果保存在数据库中,以便以后检查。
有一些不错的教程,介绍如何使用芹菜(Using celery with flask)。芹菜常与Redis和Rabbitmq一起使用