Python 当用户注销时删除旧的临时文件

Python 当用户注销时删除旧的临时文件,python,session,flask,temporary-files,Python,Session,Flask,Temporary Files,我有一个视图,它接受登录的用户输入,然后运行一个函数生成一个报告。结果将在HTML页面中返回。我也将报告呈现为PDF格式 我用函数中的内容创建了一个PDF,并将其保存在服务器上的某个文件夹中。我不想让我的服务器充满每次运行的文件,所以我在每个用户登录时为他们创建一个临时文件夹(在tmpfs中),并在他们的会话中保存路径,这不是永久的 session['temp_path'] = '/dev/shm/<random_uuid>/' 会话['temp_path']='/dev/shm/

我有一个视图,它接受登录的用户输入,然后运行一个函数生成一个报告。结果将在HTML页面中返回。我也将报告呈现为PDF格式

我用函数中的内容创建了一个PDF,并将其保存在服务器上的某个文件夹中。我不想让我的服务器充满每次运行的文件,所以我在每个用户登录时为他们创建一个临时文件夹(在tmpfs中),并在他们的会话中保存路径,这不是永久的

session['temp_path'] = '/dev/shm/<random_uuid>/'
会话['temp_path']='/dev/shm/'

用户可以通过单击注销按钮注销,否则其会话可能会过期。在用户注销后,我如何删除他们的临时文件夹?

单击注销按钮与终止会话的操作相同,对吗


有两种方法可以做到这一点:1)向会话过期例程添加代码以清理临时文件,和/或2)编写
cron
脚本以检查活动会话并清理非活动会话的临时文件。

如果有人对这个问题感兴趣,我可以用另一种方法解决它。我不检查用户是否分别注销或创建任何cron脚本

我创建了一个对象,它为创建的每个pdf运行一个计数线程。经过一段时间后,pdf将被删除

代码如下所示:

class TimeSet(set):
    def add(self, item, timeout):
        set.add(self, item)
        t = threading.Thread(target=timeout_set_remove, args=(self, item, timeout))
        t.start()

def timeout_set_remove(my_set, item, timeout):
    time.sleep(timeout)
    os.remove(str(item))
    my_set.remove(item)
set = TimeSet()
set.add(os.path.abspath(os.path.join(src_path, pdf_name)), app.config['PDF_PERSISTENCE'])
在我的烧瓶应用程序中,我这样使用它:

class TimeSet(set):
    def add(self, item, timeout):
        set.add(self, item)
        t = threading.Thread(target=timeout_set_remove, args=(self, item, timeout))
        t.start()

def timeout_set_remove(my_set, item, timeout):
    time.sleep(timeout)
    os.remove(str(item))
    my_set.remove(item)
set = TimeSet()
set.add(os.path.abspath(os.path.join(src_path, pdf_name)), app.config['PDF_PERSISTENCE'])

其中,pdf\u name是创建的pdf的名称,src\u path是文件的路径。持久性时间在我的配置文件中定义。

什么是随机的?uuid是用户ID吗?@felipsmartins random_uuid只是他们文件夹的标签,只是他们文件夹的随机名称。选择UUID只是为了让文件夹有一个唯一的名称。单击执行相同的操作。但我不知道有什么函数能代表你的“过期程序”。。。我可以将该命令放在注销函数中,但我不确定当用户被自动踢出时是否调用了相同的函数……关于“cron”脚本,对于服务器来说,该任务的RAM或功耗如何?设计这个cron脚本的最佳方法是什么?我可以想象创建一个例如APScheduler的作业来删除一个文件夹,但是如何告诉它什么时候做它的工作呢?如何检查用户在一小时前登录的会话是否仍然存在?我认为您需要研究Flask会话,以了解会话是如何过期的,以及会话是否与用户在代码中注销时相同。是的,您可以使用APScheduler而不是cron,但您应该将其作为另一个问题来问。