为了账号安全,请及时绑定邮箱和手机立即绑定

Flask:request.method =='POST' 跳过返回语句

Flask:request.method =='POST' 跳过返回语句

函数式编程 2021-12-23 16:15:55
我的应用程序有一个奇怪的问题。我正在做的是:我在 JS(客户端)中生成一个 csv 文件,然后将它发送到烧瓶,然后我使用 python 脚本过滤文件,然后将其返回给客户端。除了最后一部分,一切都很好。当涉及到返回 render_template 时,它只是跳过那部分。这很奇怪,因为它在if request.method == 'POST' 内部。我在if request.method=='POST' 中打印了值,我可以在服务器端看到这些值。烧瓶路线.py:@app.route('/update_file', methods=['GET', 'POST'])@login_requireddef update_file():    '''Opens the filtered_file page but with updated file'''    clicked = None    if request.method == 'POST':        clicked = io.StringIO(request.form['data'])        file_to_filter = pd.read_csv(clicked, sep=',', engine='python', encoding='utf_8_sig')        table1 = update_csv(file_to_filter)        print(table1)        table2 = table1.to_html(classes='my_class" id = "my_id')        return render_template('3_filtered_file.html', data=table2)这是我在我的 html 模板上显示它的方式: <div class="table-responsive">    {{data | safe}}</div>我已经对客户端上传的文件做了类似的处理,效果很好,但是这个有一个我似乎找不到的错误:/编辑: 这是我发送ajax请求的JS://On Update click renders table to csv, activates the be_filter and reopens it in the filtered_file.htmlvar isClicked;jQuery("#update").on('click', function(){    var response = confirm('Are you sure you want to UPDATE rows ?');    if(response == true){                            isClicked = $('#my_id').table2csv();        $.ajax({            type:'POST',            url:"{{url_for('update_file')}}",            data: {'data': isClicked}        });         //window.location.href='/update_file';    }else{        return false;    }});
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

这里的问题是,您应该在提交表单时使用 AJAX。AJAX 主要是在后台与服务器通信,但您正试图将其用作以编程方式提交 POST 表单数据的工具。使用 AJAX 将向服务器发送请求,就像单击链接或提交表单一样,但浏览器不会导航到结果。这就是为什么您得出的结论是flask 跳过了render_template调用,但模板确实得到了渲染。只是通过 AJAX 调用,回复只会在 AJAX 成功回调中结束,而不是在浏览器的主窗口中。


对于这样的 AJAX 请求,不需要发回 HTML。例如,您可以简单地 return "update successful"。


您可以通过从客户端手动重定向到结果页面来修复现有代码:


// in your $.ajax() options:

success: function(reply) {

  if (reply == "update successful") location = "/table"; // URL of table view

  else alert("server reports error");

}

在 AJAX 调用成功更新服务器上的 CSV 文件后,这将在客户端上重定向。


但是,您可以简单地提交实际表单:


<form id="tableDataForm" method="post" action="{{url_for('update_file')}}">

  <input type="hidden" name="data" id="tableData">

</form>

$("#update").on('click', function(){

    $('#tableData').val($('#my_id').table2csv()); // insert data into hidden <input>

    $('#tableDataForm').submit();  // send POST request

});

这就是你所需要的。现在浏览器会再次显示flask发回的回复。


查看完整回答
反对 回复 2021-12-23
  • 1 回答
  • 0 关注
  • 609 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信