【问题标题】:python flask render_template and return csv/excel to browser [duplicate]python flask render_template并将csv / excel返回到浏览器[重复]
【发布时间】:2021-03-30 05:47:57
【问题描述】:

我正在创建一个以 CSV 作为输入的烧瓶应用程序。解析 CSV 和内容。然后将更新的 CSV 返回到浏览器以下载/或立即下载。该程序需要一个 HTML 模板供用户交互。我正在尝试使用 render_template() 方法通过烧瓶返回 HTML 文件和 CSV 文件。实现这一目标的最佳方法是什么?

@app.route("/", methods=["GET", "POST"])
def index():
        if request.method == "POST":
    print("POST request received!")

    if "file" not in request.files:
        return redirect(request.url)

    list_keywords = request.files["file"]
    if not list_keywords:
        return "No file"
    the_list = io.StringIO(list_keywords.stream.read().decode("UTF8"), newline=None)
    csv_input = csv.reader(the_list)
    ...# rest of program.....
    csv_file1 = pd.DataFrame(internal_linking_opportunities,
                                     columns=["Keyword", "Text", "Source URL", "Target URL", "Link Presence", "Keyword Position"])

si = io.StringIO()
cw = csv.writer(csv_file1)
output = make_response(si.getvalue())
output.headers["Content-Disposition"] = "attachment; filename=export.csv"
output.headers["Content-type"] = "text/csv"


return Response(render_template('index.html', output=output))

我尝试使用其他方法返回 CSV,但没有成功。开始认为这可能是由于我正在使用的 render_template 函数。感谢您的帮助。

【问题讨论】:

    标签: python csv flask


    【解决方案1】:

    render_template的第二个参数叫做context,可以用来给模板提供一些渲染的变量。将Response 对象添加到模板上下文不会返回该Response,而是使该Response 对象可从模板内访问。

    Flask 有一个专门的方法将文件发送回浏览器:

    https://flask.palletsprojects.com/en/1.1.x/api/#flask.send_file

    您的退货声明可能如下所示:

    return send_file(file_pointer, as_attachment=True, attachment_filename="export.csv")
    

    除了提供文件指针作为第一个参数之外,您还可以通过提供该文件的路径来使用本地磁盘中的文件。如果您提供文件指针,请确保将其设置为文件的开头。

    【讨论】:

    • 感谢您的回答!我是 Flask 和 Python 的新手,非常感谢您的帮助。由于我还想将我的 index.html 文件发布到浏览器,我如何在同一个返回调用中完成这两者?或者我是否必须在单独的 Def 函数中设置渲染模板返回?希望这是有道理的,我不会太困惑!
    • 是的,你需要添加一个单独的视图函数/路由。至少从技术角度来看,您不能同时显示常规 HTML 页面和启动下载。不过,您可以使用一些 JavaScript 来获得类似的用户体验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    相关资源
    最近更新 更多