【问题标题】:Alternative to Ajax CallAjax 调用的替代方案
【发布时间】:2019-06-14 06:25:46
【问题描述】:

我正在调用 ajax 来执行 python 脚本。我正在使用烧瓶框架来做到这一点。它转到 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
    }
});

【问题讨论】:

  • 请注意,您的代码很容易受到命令注入攻击;如果有人打电话给http:/example.com/;rm%20-rf%20;/,你会遇到很多麻烦。永远不要信任地将用户输入(包括 URL 参数)放入 shell 命令中(除非它将在您控制的沙箱中运行并且没有其他人可以访问,但我什至不会访问)!

标签: python ajax flask


【解决方案1】:

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

有一些很好的使用 celery 的教程 (Using celery with flask)。 Celery 经常与 Redis 和 Rabbitmq 一起使用

【讨论】:

    【解决方案2】:

    您可以使用beacon。它保证它不会因页面关闭而终止(尽管它会在您关闭浏览器本身时终止)。但是,另一方面,您不会收到对脚本的响应;它通常保留给不需要在客户端确认或进一步数据的只写请求。

    navigator.sendBeacon(url, data);
    

    不过,还是有几个浏览器支持do not support it

    如果您需要响应,除了 AJAX(或页面转换)之外别无选择。


    但是,如果您的submit 工作提出请求,则不应终止它。当然,如果用户浏览您的页面,您将不会得到响应,但烧瓶应该完成工作。试试这个:

    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

    【讨论】:

    • 哦,我一定会查的。但是,返回的响应非常重要,它将显示为通知。所以,我在想,我们可以将它存储在某个地方,以便我可以将它作为通知显示在同一服务器上的其他页面上吗?
    • 您无法显示或存储您从未收到过的东西;并且您将收到它的唯一方法是如果您使用 AJAX 并且您仍在同一页面上(或者如果您进行页面转换,而不是取消它,并且新页面具有该数据)。除非,正如@maanijou 建议的那样,您在服务器上的单独线程或进程中进行处理,并在不同的请求中获取结果。
    • 好的,这会很有帮助
    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多