2017-07-06 158 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