最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】Flask中如何保存临时文件且可以指定有效期

Flask crifan 4048浏览 0评论

折腾:

【已解决】后台用Flask封装百度的语音合成功能对外提供REST API接口

期间,需要去想办法实现这个效果:

可以保存临时语音合成的mp3数据到某个临时文件中

且可以设置有效期,比如10分钟,过了有效期后自动就消失-》防止占用系统内存或物理磁盘之类的

目前能想到的是,或许可以用redis,保存文件时设置expire时间?

Flask如何保存临时文件,且有个有效期的那种

然后对于外部rest api的话,可以返回url供访问

【调研】考虑用Python的临时文件实现保存临时文件且过期自动删除

所以感觉又是:

从原理上来说:

保存临时mp3数据到 真正的硬盘上某个此处专门用来存储临时数据的文件夹中

然后把文件路径保存到redis中,且设置一个过期时间

到了过期时间,然后系统再回调函数,去删除对应的文件

这样才能保证:

在有效期内,不论何时,临时文件都是存在的

且系统中不会存在大量的临时数据 -》因为有效期是自己设置的,可以很短,这期间不会有大量的用户的请求去产生临时文件

flask delay function

Python repeat function in flask until desired result with 40 second delay – Stack Overflow

Sleep How Can I Make a Time Delay in Python | freeCodeCamp Guide

Basic Message Queue with Redis | Flask (A Python Microframework)

Celery Background Tasks — Flask 1.0.2 documentation

好像可以用这个:

Flask delay task

python – Making an asynchronous task in Flask – Stack Overflow

Using Celery With Flask – miguelgrinberg.com

closeio/tasktiger: Python task queue. Because celery is gross.

看起来也一般

在 Flask 中使用 Celery — using celery with flask 1.00 documentation

Step 4: Celery based background tasks — Flask-AppFactory 0.2.2.dev20150818 documentation

很一般。

基于 Celery 的后台任务 — Flask 0.10.1 文档

但是看到:

result.wait()

不知道如何指定延期时间

【已解决】Celery中如何指定延期多长时间后再运行任务

所以:

可以用celery,然后用apply_async调用task,传递countdown为10*60,即可指定:

10分钟后再运行任务

然后就是:

【已解决】Mac本地用Celery实现延时执行任务

不过发现一个新文件

dump.rdb

看起来像是redis的文件

dump.rdb

NoSQL之【Redis】学习(三):Redis持久化 Snapshot和AOF说明 – jyzhou – 博客园

“RDB就是Snapshot快照存储,是默认的持久化方式。即按照一定的策略周期性的将数据保存到磁盘。对应产生的数据文件为dump.rdb,通过配置文件中的save参数来定义快照的周期。”

Redis Persistence – Redis

“Snapshotting

By default Redis saves snapshots of the dataset on disk, in a binary file called dump.rdb. ”

看起来,暂时可以不去动redis的配置文件,就让他默认这么保存即可。

再去把celery的worker集成到Flask,确保可以正常调用,执行异步延时任务:

【已解决】把celery的task集成到Flask的app中

然后再去想办法集成到Flask中,且celery和redis的服务,也要集成到之前管理任务的supervidor中:

【已解决】把Celery+Redis集成到在线Flask中且用supervisor去管理后台服务

【总结】

如此,即可完成想要的效果了:

flask中,保存临时文件,且设置有效期,过了有效期自动删除掉

方案是:

在Flask中,用celery+redis去实现异步任务,调用apply_async时加上countdown延期时间,即可实现删除对应文件。

而文件本身很小,也不是很多,就放在flask项目下tmp/audio中即可。

具体代码和方式,详见:

【已解决】Mac本地用Celery实现延时执行任务

【已解决】把celery的task集成到Flask的app中

【已解决】把Celery+Redis集成到在线Flask中且用supervisor去管理后台服务

转载请注明:在路上 » 【已解决】Flask中如何保存临时文件且可以指定有效期

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.186 seconds, using 22.13MB memory