Удалить файл пользователя через несколько дней после удаления пользователя в Django - PullRequest
1 голос
/ 13 апреля 2020

В моем приложении 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 Ответ

2 голосов
/ 13 апреля 2020

Было бы хорошо использовать 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():
    # 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())

NB : я взял этот пример из здесь только для иллюстрации идеи. Вы также можете, конечно, включить эту идею в любой способ решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...