flask框架response向前端同时发送多个文件

用flask框架做了个简单的网页,后端已经处理生成了excel和word两个文件流,我知道用response可以直接return到前端下载,但是好像一次只能推一个(前端只收到一个文件),怎么弄才能同时把文件推送到前端下载呢?

要在Flask中同时向前端推送多个文件,您可以将它们组合成一个zip文件,然后将该文件作为响应返回。以下是一个示例代码,假设您的后端已经生成了名为excel_data.xlsx和word_data.docx的两个文件流:

python

import io  
import zipfile  
from flask import Flask, Response  
  
app = Flask(__name__)  
  
@app.route('/download')  
def download():  
    # 将两个文件流组合成一个zip文件  
    with io.BytesIO() as output:  
        with zipfile.ZipFile(output, mode='w') as zip_file:  
            zip_file.writestr('excel_data.xlsx', excel_data)  
            zip_file.writestr('word_data.docx', word_data)  
            # 将zip文件作为响应返回  
    return Response(output.getvalue(), mimetype='application/zip')

在上面的代码中,excel_data和word_data分别代表了两个文件流的数据。您可以根据实际需求进行修改。该代码会将这两个文件组合成一个zip文件,并将该zip文件作为响应返回给前端。在前端,您可以设置一个链接或按钮,使用户可以点击下载这个zip文件。

  • 这篇博客也许可以解决你的问题👉 :人生苦短,我用Python 七:如何在flask文档在return后,继续执行文档函数?
  • 除此之外, 这篇博客: flask自定义返回response中的 直接通过函数返回 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 看下面的例子

    返回一个 三元组 即可 (body,status,headers)

    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/')
    @app.route('/index')
    def index():
        # response body , status code reason phrase, response headers
        return "<h1>This is index page!</h1>", "501 no reason", {"name": "frank", "age": 18}
    
    
    if __name__ == '__main__':
        app.run(host='127.0.0.1', port=5000, threaded=True, debug=True) 
    

    访问页面 如下

    img-01

    可以看到 status 已经修改, headers 已经加入了name, age 这两个值 , content-type 这个 我并没有设置 默认返回 就是 text/html , 这里 就是告诉浏览器,用 html 的方式 ,进行解析返回内容

    有的时候 需要返回json 这种类型,可以修改 content-type 来改变 这个值

    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/')
    @app.route('/index')
    def index():
        # response body , status code reason phrase, response headers
    
        return {'greet': 'hello world'}, 200, {"Content-Type": "application/json"}
    
    
    
    if __name__ == '__main__':
        app.run(host='127.0.0.1', port=5000, threaded=False, debug=False)
    

    这样就可以返回 json 类型了。 图中看出好像 有content-type 是一样的值,这是因为如果 body 返回字典,默认使用 jsonify 来构建response, 在构建 response 的时候 ,会自动添加content-type 类型 . 如果 指定content-type 的话, 会自动添加到 header 头里面,所以就会重复出现相同的 content-type

    img-01-01

    所以 flask 框架 还是非常智能的, 所以 就不指定headers 就好了。

    @app.route('/')
    @app.route('/index')
    def index():
        # response body , status code reason phrase,
        return {'greet': 'hello world'}, 200