【问题标题】:Flask: request.method =='POST' skips return statementFlask:request.method =='POST' 跳过返回语句
【发布时间】:2020-03-07 03:42:43
【问题描述】:

我的应用有一个奇怪的问题。

我正在做的是: 我在 JS(客户端)中生成一个 csv 文件,然后将其发送到烧瓶,然后我使用 python 脚本过滤文件,然后将其返回给客户端。

除了最后一部分,一切都很好。当涉及到 return render_template 时,它只是跳过了该部分。这很奇怪,因为它进入了 if request.method == 'POST'。我在 if request.method=='POST' 中打印了值,我可以在服务器端看到这些值。

烧瓶路由.py:

@app.route('/update_file', methods=['GET', 'POST'])
@login_required
def 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.html
var 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;
    }
});

【问题讨论】:

  • 这很奇怪。我以为这也解决了。你的 table1.to_html 做什么?应该是 table1.to_html(classes="my_class", id = "my_id") 吗?
  • 您的 3_filtered_file.html 在哪里?它在模板文件夹中吗?
  • 是的,它在模板文件夹中
  • 在 POST 请求/表单提交后按 Ctrl+U 时,您在浏览器中究竟看到了什么?有什么渲染的吗?你能在源代码中看到&lt;div class="table-responsive"&gt; 吗?您是否检查了浏览器控制台的错误消息?
  • to_html 只是一个函数,它接受 csv 文件并将其呈现为 html 表,以便您可以在 html 中打开它。我已经为上传的文件做了这个并且它有效

标签: javascript python ajax flask


【解决方案1】:

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

在这样的 AJAX 请求的情况下,没有必要发回 HTML。例如,您可以简单地返回 "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发回的回复。

【讨论】:

  • 感谢您的回答,但我不想只将 csv 文件保存在服务器上。我想将它发送到服务器,在那里它通过一个过滤器(可以这么说)-python 脚本,然后我将它发送回客户端并将其表示为一个 html 表。当我按照你用success 写的那样做时,它只返回没有数据的“3_filtered_file”html:我的过滤文件
  • 好的,3_filtered_file.html 是一个完整的 HTML 文件吗?在这种情况下,使用&lt;form&gt; 解决方案,它会出现在浏览器中,data 已插入等等。除非您知道 AJAX 是如何工作的,否则不要使用它。
  • 是的,它是完整的 HTML 文件。我用&lt;form&gt; 尝试了您的解决方案,它最终返回带有数据的HTML,但也返回GET 500 (INTERNAL SERVER ERROR)
  • 不确定如何帮助您解决这个问题,听起来像是与此问题无关的烧瓶问题。
  • 可能,:/ 会尝试搜索解决方案,但感谢您花时间帮助我。我使用了您发布的两种方式,1. 使用表单,因为我不得不再次返回数据;2. 使用 ajax,因为我只是发送到服务器输入。
猜你喜欢
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多