簡體   English   中英

Python Flask - 如何使用 send_from_directory 下載文件並在瀏覽器中顯示文本 output

[英]Python Flask - How to download a file with send_from_directory AND display text output in browser

我希望能夠在通過 send_from_directory 觸發下載后向用戶顯示一條消息。

@app.route('/downloadFile', methods=['GET'])
def download():

    return send_from_directory(output_directory, "myfile.txt", as_attachment=True)

這將在訪問 /downloadFile 端點后觸發下載,但除了觸發下載外,我還希望瀏覽器中的 output 顯示“文件下載已觸發”之類的內容。 有沒有辦法做到這一點? 如果我沒有使用 send_from_directory,我可以做這樣的事情來返回一些 JSON return {'Status': 'file download triggered'}

我正在尋找一種將兩者結合起來的方法,這樣用戶在點擊此端點時就不會看到空白屏幕。

您可以做的是,在給定端點返回 render_template() 以呈現 html 文件,該文件將顯示類似“您的文件正在下載”或您想要的任何消息,並在同一個 html 文件中,使用 JS 觸發將下載文件的第二個端點。

@app.route('/downloadPage', methods=['GET'])
def download_page():
    return render_template("download_page.html")

@app.route('/downloadFile')
def download_file():
    return send_from_directory(output_directory, "myfile.txt", as_attachment=True)

在 HTML 文件中,JS 將類似於 -

<SCRIPT>
   window.location.href = "/DownloadFile";
</SCRIPT>

編輯 1:

@fpolig01 這是我所做的 -> 我使用 flask 中的 save_file 創建了一個 function 並返回了這個

def download_file():
    return send_file('static/downloads/filename.csv',
                     mimetype='text/csv',
                     as_attachment=True)

在此之后,在您的 app.route() 代碼中,將其稱為 function。類似於 ->

@app.route('/downloadFile')
def download_file():
    result = download_file()
    return result

在 JS 中,你必須重定向到這個 URI,它會直接開始下載/會顯示一個彈出窗口來保存文件。 客戶仍然只停留在最后一頁。 至少這對我有用。

或者你至少可以做的是,創建一個帶有下載文件按鈕的 html 頁面,將按鈕配置為 go 到此下載鏈接,然后就可以了。

告訴我你做了什么

對於任何請求,只能有一個響應。 HTML 頁面響應和文件下載響應必須是它們各自對兩個單獨請求的響應。

為了獲得您想要的效果,您需要兩個端點:一個端點返回 HTML 響應,第二個端點處理文件下載。

來自第一個路由的 HTML 響應可以包含javascript 代碼以啟動從第二個端點下載文件 這個的實現可能看起來接近pushpak ruhil 的答案

暫無
暫無

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

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