2017-07-06 161 views
2

我有一個按鈕出口:如何用Python下載文件(Jinja2)點擊導出按鈕?

<button class="aptButton" formaction="/export/" type="submit">export</button> 

,我有這個在/導出/

的index.cgi

#! /apollo/sbin/envroot $ENVROOT/bin/python 
# -*- coding: utf-8 -*- 

    import cgitb 
    cgitb.enable() 

    import cgi 

    def main(): 
     print "Content-Type: text/html" 
     print 
     form = cgi.FieldStorage() 

     results = helpers.getResults() 
     environment = helpers.get_environment() 


     print environment.get_template('export.html').render(
       results = results) 

    main() 

,我有這在我的export.html

<!doctype html> 
{% for id in results %} 
    {{ write_results_to_file(id) }} 
{% endfor %} 

我想下載結果到一個製表符分隔的文件,所以我想寫ng到本地文件,然後發送(下載)文件,但我不知道如何做下載部分,我不能使用瓶或django哪些有一些很好的libs ..有沒有其他的lib,我可以用它來下載結果到用戶桌面上的製表符分隔文件?

export.py

def write_results_to_file(result): 
    local_filename = "/home/testing.txt" 
    # NOTE the stream=True parameter 
    with open(local_filename, 'w') as f: 
     f.write('\t'.join(result) + '\n') 

回答

3

如果你使用老式的CGI製作製表符分隔的文件, 所有你需要做的是打印一個合適的標題,然後打印stdout內容,這樣的事情:

def main(): 
    form = cgi.FieldStorage() 
    results = helpers.getResults() 

    print "Content-Type: text/plain" 
    print "Content-Disposition: attachment; filename=testing.txt" 
    print 

    for result in results: 
     print '\t'.join(result) + '\n' 

main() 

的主要部分是2行那print頭, 後跟一個空行從內容分離,隨後 由純文本內容。

如果你想做到這一點上出口點擊按鈕, 那麼你就可以,例如:

  • 充分利用出口按鈕,將使用另一個URL端點的鏈接我上面寫的示例腳本
  • 或者,使用相同的腳本,在表單參數上使用條件語句來決定打印首頁,或者使用上面的示例腳本打印內容:

讓我知道你是否需要進一步的幫助。

+0

我跟着你的例子,但當我點擊導出,它重定向到另一個URL並顯示Content-Type:text/plain Content-Disposition:attachment; filename = testing.txt ATTTGTA ATTTGTA ATTTGTA ATTTGTA在瀏覽器中 – user3407267

+0

我做錯了什麼? – user3407267

+0

我使用了結果= [[「ATTTGTA」],[「ATTTGTA」,「ATTTGTA」,「ATTTGTA」]]來查看它是否有效。它應該下載每個列表在一個新的行與製表符分隔值,所以ATTTGTA在第一行和ATTTGTA ATTTGTA ATTTGTA在第二行應該被下載到一個文件(如保存或其他) – user3407267