替代Ajax Call

时间:2019-06-14 06:25:46

标签: python ajax flask

我正在执行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
    }
});

2 个答案:

答案 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,然后在分钟结束前导航;一分钟后,您应该在目录中同时找到woo1woo2

答案 1 :(得分:0)

针对此类问题的常见解决方案是使用Celery。使用celery,您可以运行异步任务,而无需等待结果。它基本上是用于在后台运行任务的队列。您可以启动任务并等待其完成。即使关闭浏览器,任务也将继续运行。使用正确的配置,您可以将结果保存在数据库中,以便以后检查。

有一些不错的教程,介绍如何使用芹菜(Using celery with flask)。芹菜常与Redis和Rabbitmq一起使用