【问题标题】:Remove old temporary files when user is logged out用户注销时删除旧的临时文件
【发布时间】:2015-07-08 21:57:07
【问题描述】:

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

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

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

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

【问题讨论】:

  • 什么是 random_uuid? uuid 是用户 ID 吗?
  • @felipsmartins random_uuid 只是他们文件夹的标签,只是他们文件夹的随机名称。选择 UUID 只是为了让文件夹具有唯一的名称

标签: python session flask temporary-files


【解决方案1】:

单击注销按钮与使会话过期的作用相同,对吧?

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

【讨论】:

  • 点击做同样的事情。但我不知道任何代表您的“到期例程”的函数......我可以将命令放在注销函数中,但我不确定当用户被自动踢出时是否调用了相同的函数......
  • 关于 'cron' 脚本,这个任务对服务器的 RAM 或功耗有多大?如何设计这个 cron 脚本的最佳方法是什么?我可以想象创建例如。 APScheduler 有一个删除文件夹的工作,但是如何告诉它什么时候做它的工作?如何检查用户的会话是否在之前登录,例如。一个小时还存在吗?
  • 我认为您需要研究 Flask 会话以了解会话如何过期以及它是否与他们在您的代码中注销时相同。是的,您可以使用 APScheduler 代替 cron,但您应该将其作为另一个问题提出。
【解决方案2】:

如果有人对此问题感兴趣,我会以另一种方式解决。我不检查用户是否分别注销或创建任何 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'])

其中 pdf_name 是创建的 pdf 的名称,src_path 是文件的路径。持久化时间在我的配置文件中定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多