如何在Python(Jinja2)下载文件点击导出按钮?

时间:2017-07-06 22:30:12

标签: python python-2.7 python-3.x cgi jinja2

我有一个按钮导出:

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

我在/ export /

中有这个

的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 %}

我正在尝试将结果下载到制表符分隔文件中,所以我想写入本地文件,然后发送(下载)文件,但我不知道如何进行下载部分,我不能使用烧瓶或django有一些好的lib ..有没有其他的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')

1 个答案:

答案 0 :(得分: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()

基本部分是print标题的2行, 然后是一个空白行与内容分开, 其次是纯文本内容。

如果您想通过点击导出按钮实现此目的, 那么你可以,例如:

  • 导出按钮设为指向另一个将使用上面的示例脚本的网址端点的链接
  • 或者,使用相同的脚本,在表单参数上使用条件语句来决定打印首页,或者使用上面的示例脚本打印内容

如果您需要进一步的帮助,请告诉我。