2017-01-03 77 views
0

我創建了一個Flask應用程序,它可以創建一個列表並將列表返回給HTML頁面。我還想將列表下載爲CSV文件。Flask是否可以顯示列表中的數據並提供下載鏈接?

到目前爲止,我理解如何以單獨的功能完成這些任務。

有沒有一種方法可以將這些功能合併爲一個,以便只創建一次列表,在HTML模板上顯示數據並提供下載鏈接?

請查看基本示例如下:

from flask import Flask, render_template, Response, url_for 

app = Flask(__name__) 

@app.route('/') 
def hello_world(): 
    fruits = ['apple', 'pear', 'banana', 'grapes', 'mango'] 
    return render_template('fruit.html', fruit=fruits) 


@app.route('/fruits.csv') 
def generate_fruit_file(): 
    def generate(): 
     fruits = ['apple', 'pear', 'banana', 'grapes', 'mango'] 
     for f in fruits: 
      yield ''.join(f) + '\n' 
    return Response(generate(), mimetype='text/csv') 


if __name__ == '__main__': 
    app.run(debug=True) 

HTML模板:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
{% for f in fruit %} 
    <ul> 
     <li style="display: block;">{{ f }}</li> 
    </ul> 
{% endfor %} 
    <a href="{{'/fruits.csv'}}">get file</a> 
</body> 
</html> 
+0

我相信你的問題缺乏一些背景。當你說你的應用程序生成了一個列表的東西,這意味着列表是從一些數據生成的。數據存儲在哪裏? – Born2Discover

+0

你可以參考http://stackoverflow.com/questions/24577349/flask-download-a-file – SunilT

+0

Born2Discover:數據是從API調用創建並存儲到數據庫中。在我的主要項目中,我使用生成器函數來收集數據。然後將生成器的輸出存儲到列表對象,然後將其保存到數據庫並在模板上顯示。 – user50083

回答

0

最簡單的方法是定義你的模塊中的全局變量fruits您從每個功能訪問。

fruits = ['apple', 'pear', 'banana', 'grapes', 'mango'] 

@app.route('/') 
def hello_world(): 
    global fruits 
    return render_template('fruit.html', fruit=fruits) 


@app.route('/fruits.csv') 
def generate_fruit_file(): 
    def generate(): 
     global fruits 
     for f in fruits: 
      yield ''.join(f) + '\n' 
    return Response(generate(), mimetype='text/csv') 
+0

我最初試過這個。它在調試模式下效果很好,但在生產中不起作用。也許使用flask.g是一個選項? – user50083

+0

這很奇怪。你遇到了什麼錯誤? 'Flask.g'將不起作用,因爲它只在一個請求期間存儲值。在你的情況下,你有兩個單獨的請求:一個請求顯示你的html文件,一個請求下載csv。 – MrLeeh

+0

請記住,我提交的代碼與我正在進行的項目相似。收集數據並生成列表的功能可以輕鬆地將數據發送到全局變量。我從另一個函數返回數據有問題。數據在文件輸出功能可以收集它時導致空文件消失。 – user50083

相關問題