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

How to download a file in Python (Jinja2) on-click Export button?

我有一个导出按钮 :

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

我正在尝试将结果下载到制表符分隔的文件中,所以我想写入本地文件然后发送(下载)该文件,但我不确定如何进行下载部分,我无法使用flask 或 django 有一些很好的库。有没有其他库可以用来将结果下载到用户桌面上的制表符分隔文件?

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')

如果您使用良好的 old-fashioned CGI 生成 tab-separated 文件, 您需要做的就是打印一个适当的 header 然后在 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 header 的两行, 后跟一个空行来与内容分开, 后面是纯文本内容。

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

  • Export 按钮作为 link 到另一个 URL 将使用我在上面放置的示例脚本的端点
  • 或者,使用相同的脚本,在表单参数上使用条件语句来决定打印首页,或者使用上面的示例脚本打印内容

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