Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Flask send_file函数由内联JS触发,但实际上不返回send_文件_Javascript_Python_Flask - Fatal编程技术网

Javascript Flask send_file函数由内联JS触发,但实际上不返回send_文件

Javascript Flask send_file函数由内联JS触发,但实际上不返回send_文件,javascript,python,flask,Javascript,Python,Flask,关于我和这个问题的一些背景知识。我不是一个网络开发人员,也从来没有关于这个主题的正式指导,所以我只是随机应变,使用任何能让它工作的东西。我正在使用Flask创建一个网站,当您传递某些信息时,它将返回一个.zip文件,其中包含您请求的文件。然而,该网站需要下载文件并对其执行一些其他过程,因此这是一个耗时的过程,当我在heroku上托管我的应用程序时,它会超时 为了绕过这个问题,我使用了下面描述的方法: 以那篇文章为指导,我的代码如下所示: <script> var reques

关于我和这个问题的一些背景知识。我不是一个网络开发人员,也从来没有关于这个主题的正式指导,所以我只是随机应变,使用任何能让它工作的东西。我正在使用Flask创建一个网站,当您传递某些信息时,它将返回一个.zip文件,其中包含您请求的文件。然而,该网站需要下载文件并对其执行一些其他过程,因此这是一个耗时的过程,当我在heroku上托管我的应用程序时,它会超时

为了绕过这个问题,我使用了下面描述的方法:

以那篇文章为指导,我的代码如下所示:

<script>
    var request = new XMLHttpRequest();
    request.responseType = 'blob';
    request.open('POST', '/long_function/'+{{ var1|safe }} +'/'+ {{ var2|safe }});

    function saveBlob(blob, fileName) {
    var a = document.createElement('a');
    a.href = window.URL.createObjectURL(blob);
    a.download = fileName;
    a.dispatchEvent(new MouseEvent('click'));
}


    request.onload = function(e) {
      if (request.status === 200) {
        // long process finished successfully, redirect user
        var blob = e.currentTarget.response;
        saveBlob(blob, 'data.zip')
        window.location = {{ return_to|safe }};
      } else {
        // ops, we got an error from the server
        alert('Something went wrong.');
      }
    };

    request.onerror = function() {
      // ops, we got an error trying to talk to the server
      alert('Something went wrong.');
    };

    request.send();
</script>
app.py

@app.route('/long_function/<var1>/<var2>', methods=['GET', 'POST'])
def long_function(var1, var2):
    if request.method == 'POST':
        #Long task...
        return send_file(data, as_attachment=True, attachment_filename='data.zip')

    if request.method == 'GET':
         return render_template('waiting.html', var1=json.dumps(var1), var2=json.dumps(var2), return_to=json.dumps('/home')
@app.route('/long_function/',methods=['GET','POST'])
def长_功能(var1、var2):
如果request.method==“POST”:
#漫长的任务。。。
返回发送文件(数据,如附件=True,附件文件名='data.zip')
如果request.method==“GET”:
返回render_模板('waiting.html',var1=json.dumps(var1),var2=json.dumps(var2),return_to=json.dumps('/home'))
waiting.html

<script>
    var request = new XMLHttpRequest();
    request.open('POST', '/long_function/'+{{ var1|safe }} +'/'+ {{ var2|safe }});


    request.onload = function() {
      if (request.status === 200) {
        // long process finished successfully, redirect user
        window.location = {{ return_to|safe }};
      } else {
        // ops, we got an error from the server
        alert('Something went wrong.');
      }
    };

    request.onerror = function() {
      // ops, we got an error trying to talk to the server
      alert('Something went wrong.');
    };

    request.send();
</script>

var request=new XMLHttpRequest();
open('POST','/long_function/'+{var1 | safe}}+'/'+{{var2 | safe}}});
request.onload=函数(){
如果(request.status==200){
//长进程成功完成,重定向用户
window.location={{return_to | safe}};
}否则{
//ops,我们从服务器上得到一个错误
警惕(‘出了什么事’);
}
};
request.onerror=函数(){
//ops,我们试图与服务器通话时出错
警惕(‘出了什么事’);
};
request.send();
这样,当我向long_函数提交GET请求时,我立即得到一个有效的响应,即呈现waiting.html模板。同时,当呈现模板时,JS脚本发送带有相应信息的POST请求,从而绕过超时错误

问题是长任务完成后,.zip文件从未发送回我。Flask过程表明JS脚本发出的POST请求是有效的,在测试时,我可以获得POST请求以将重定向函数返回到另一个url。此外,.zip文件正确生成,文件下载并处理Flask和Python也不会出现任何错误

我猜这与JS有关,但我的JS知识几乎不存在,正如我之前所说,web开发不是我非常熟悉的东西。我知道有其他选项可以运行像芹菜这样的后台进程,但我希望尽可能简单

为了让Flask返回.zip文件,我错过了什么?非常感谢您的评论!

多亏了这篇文章,我才能够弄清楚到底发生了什么

由于POST请求是使用JS通过浏览器发出的,Flask正在发送.zip文件作为对使用JS通过浏览器发出的请求的响应。因此,我需要使用JS响应下载该文件。我能够使用此帖子中的答案实现它

因此,mywaiting.html中的脚本现在如下所示:

<script>
    var request = new XMLHttpRequest();
    request.responseType = 'blob';
    request.open('POST', '/long_function/'+{{ var1|safe }} +'/'+ {{ var2|safe }});

    function saveBlob(blob, fileName) {
    var a = document.createElement('a');
    a.href = window.URL.createObjectURL(blob);
    a.download = fileName;
    a.dispatchEvent(new MouseEvent('click'));
}


    request.onload = function(e) {
      if (request.status === 200) {
        // long process finished successfully, redirect user
        var blob = e.currentTarget.response;
        saveBlob(blob, 'data.zip')
        window.location = {{ return_to|safe }};
      } else {
        // ops, we got an error from the server
        alert('Something went wrong.');
      }
    };

    request.onerror = function() {
      // ops, we got an error trying to talk to the server
      alert('Something went wrong.');
    };

    request.send();
</script>

var request=new XMLHttpRequest();
request.responseType='blob';
open('POST','/long_function/'+{var1 | safe}}+'/'+{{var2 | safe}}});
函数saveBlob(blob,文件名){
var a=document.createElement('a');
a、 href=window.URL.createObjectURL(blob);
a、 下载=文件名;
a、 dispatchEvent(新建MouseeEvent('click'));
}
request.onload=函数(e){
如果(request.status==200){
//长进程成功完成,重定向用户
var blob=e.currentTarget.response;
saveBlob(blob,'data.zip')
window.location={{return_to | safe}};
}否则{
//ops,我们从服务器上得到一个错误
警惕(‘出了什么事’);
}
};
request.onerror=函数(){
//ops,我们试图与服务器通话时出错
警惕(‘出了什么事’);
};
request.send();