python – 如何清理与send_file一起使用的临时文件?

前端之家收集整理的这篇文章主要介绍了python – 如何清理与send_file一起使用的临时文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个服务器端json接口,其中几个临时文件在请求期间被操纵.

我目前在请求结束时清理这些文件解决方案如下所示:

@app.route("/method",methods=['POST'])
def api_entry():
    with ObjectThatCreatesTemporaryFiles() as object:
        object.createTemporaryFiles()
        return "blabalbal"

在这种情况下,清理在对象中使用花边.__ exit __()

然而,在少数情况下,我需要将一个临时文件返回给客户端,在这种情况下,代码如下所示:

@app.route("/method",methods=['POST'])
def api_entry():
    with ObjectThatCreatesTemporaryFiles() as object:
        object.createTemporaryFiles()
        return send_file(object.somePath)

这当然不起作用,因为当我进行清理时,烧瓶正在读取文件并将其发送给客户端.
¨
我该如何解决

编辑:我忘了提到这些文件位于临时目录中.

解决方法

如果您使用Flask 0.9或更高版本,您可以使用 after_this_request装饰器:
@app.route("/method",methods=['POST'])
def api_entry():
    tempcreator = ObjectThatCreatesTemporaryFiles():
    tempcreator.createTemporaryFiles()

    @after_this_request
    def cleanup(response):
        tempcreator.__exit__()
        return response

    return send_file(tempcreator.somePath)

编辑

因为这不起作用,你可以尝试使用cStringIO(这假设你的文件足够小以适应内存):

@app.route("/method",methods=["POST"])
def api_entry():
    file_data = dataObject.createFileData()
    # Simplest `createFileData` method:  
    # return cStringIO.StringIO("some\ndata")
    return send_file(file_data,as_attachment=True,mimetype="text/plain",attachment_filename="somefile.txt")

或者,您可以像现在一样创建临时文件,但不依赖于您的应用程序来删除它们.相反,设置一个cron作业(或者在Windows上运行的计划任务)运行一小时左右,并删除临时目录中超过半小时创建的文件.

原文链接:https://www.f2er.com/python/185672.html

猜你在找的Python相关文章