簡體   English   中英

Flask:request.method =='POST' 跳過返回語句

[英]Flask: request.method =='POST' skips return statement

我的應用程序有一個奇怪的問題。

我正在做的是:我在 JS(客戶端)中生成一個 csv 文件,然后將其發送到 flask,然后我使用 python 腳本過濾文件,然后將其返回給客戶端。

除了最后一部分,一切都很好。 當涉及到返回 render_template時,它只是跳過了那部分。 這很奇怪,因為它進入了if request.method == 'POST' 我在if request.method=='POST'中打印了值,我可以在服務器端看到這些值。

Flask routes.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;
    }
});

這里的問題是,當您應該提交表單時,您使用的是 AJAX。 AJAX 主要是關於在后台與服務器通信,但您正試圖將其用作以編程方式提交 POST 表單數據的工具。 使用 AJAX 將向服務器發送請求,就像單擊鏈接或提交表單一樣,但瀏覽器不會導航到結果 這就是為什么您得出結論認為 flask 跳過了render_template調用,但模板確實被渲染了。 只是通過 AJAX 調用,回復只會在 AJAX 成功回調中結束,而不是在瀏覽器的主 window 中。

在像這樣的 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 發回的回復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM