加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 23:37:12 所属栏目:Python 来源:网络整理
导读:我正在开发一个服务器端json接口,其中几个临时文件在请求期间被操纵. 我目前在请求结束时清理这些文件的解决方案如下所示: @app.route("/method",methods=['POST'])def api_entry(): with ObjectThatCreatesTemporaryFiles() as object: object.createTempo
我正在开发一个服务器端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("somendata")
    return send_file(file_data,as_attachment=True,mimetype="text/plain",attachment_filename="somefile.txt")

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读