为了账号安全,请及时绑定邮箱和手机立即绑定

在 Django 中删除用户几天后删除用户的文件

在 Django 中删除用户几天后删除用户的文件

元芳怎么了 2022-10-06 16:53:30
在我的 Django 应用程序中,我想在用户删除其帐户 4-5 天后删除用户的媒体文件(他们的个人资料图片和其他图像)。def delete_files(sender, instance, **kwargs):    path = str(os.getcwd())    try:        pathdl = f"{path}\\data\\media\\{instance.username}"        shutil.rmtree(pathdl)    except Exception:        print(Exception)post_delete.connect(delete_files, sender=User)我曾经post_delete删除用户的文件,但是如何在 4-5 天或某个时间段后删除文件。
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

将 django-celery-beat 用于定期任务会很好:http: //docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#beat-custom-schedulers


以此为例


将此视为您的用户models.py。您在这里需要的是一个过期字段,cronjob 在删除它之前会对其进行检查。


models.py


   class Foo(models.model):

       UserId= models.CharField(max_length=40, unique=True) #user pk here

       expiration_date = models.DateTimeField() # you would set the time here

views.py


import datetime

from django.utils import timezone


def add_foo(instance):

    # Create an instance of foo with expiration date now + one day

    objects.create(expiration_date=timezone.now() + datetime.timedelta(days=1))

        path = str(os.getcwd())

    try:

        pathdl = f"{path}\\data\\media\\{instance.username}"

        shutil.rmtree(pathdl)

        User.objects.create(expiration_date=timezone.now() + datetime.timedelta(days=1))

    except Exception:

        print(Exception)

post_delete.connect(delete_files, sender=User)

tasks.py


from celery.schedules import crontab

from celery.task import periodic_task

from django.utils import timezone


@periodic_task(run_every=crontab(minute='*/5'))

def delete_old_foos():

    # Query all the expired date in our database

    userMedia = Users.objects.all()

    #Or get a specific user id to delete their file

    # Iterate through them

    for file in userMedia :

    

        # If the expiration date is bigger than now delete it

        if file.expiration_date < timezone.now():

            file.delete()

            # log deletion

    return "completed deleting file at {}".format(timezone.now())


当然,你也可以将这个想法融入到任何你想解决这个问题的方式中。


查看完整回答
反对 回复 2022-10-06
  • 1 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号