我正在开发一个服务器端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上运行的计划任务)运行一小时左右,并删除临时目录中超过半小时创建的文件.