【问题标题】:Remove file after Flask serves itFlask 提供文件后删除文件
【发布时间】:2017-04-12 16:48:53
【问题描述】:

我有一个 Flask 视图,它生成数据并使用 Pandas 将其保存为 CSV 文件,然后显示数据。第二个视图为生成的文件提供服务。我想在下载文件后删除它。我当前的代码引发了权限错误,可能是因为after_request 在使用send_from_directory 提供文件之前删除了该文件。送达后如何删除文件?

def process_data(data)
    tempname = str(uuid4()) + '.csv'
    data['text'].to_csv('samo/static/temp/{}'.format(tempname))
    return file

@projects.route('/getcsv/<file>')
def getcsv(file):
    @after_this_request
    def cleanup(response):
        os.remove('samo/static/temp/' + file)
        return response

    return send_from_directory(directory=cwd + '/samo/static/temp/', filename=file, as_attachment=True)

【问题讨论】:

    标签: python csv flask


    【解决方案1】:

    after_request 在视图返回之后但在响应发送之前运行。发送文件可能会使用流式响应;如果您在完全阅读之前删除它,您可能会遇到错误。

    这主要是 Windows 上的问题,其他平台可以将文件标记为已删除并保留它直到它不被访问。但是,无论平台如何,仅在确定文件已发送后才删除文件可能仍然有用。

    将文件读入内存并提供服务,这样您以后删除它时就不会读取它。如果文件太大而无法读入内存,请使用生成器提供服务然后将其删除。

    @app.route('/download_and_remove/<filename>')
    def download_and_remove(filename):
        path = os.path.join(current_app.instance_path, filename)
    
        def generate():
            with open(path) as f:
                yield from f
    
            os.remove(path)
    
        r = current_app.response_class(generate(), mimetype='text/csv')
        r.headers.set('Content-Disposition', 'attachment', filename='data.csv')
        return r
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2015-10-16
      相关资源
      最近更新 更多