所以我制作了VerificationToken
模型
class VerificationToken(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
code = models.CharField(max_length=4)
date_created = models.DateTimeField(auto_now_add=True)
@property
def expiration(self):
lifetime = timedelta(minutes=10)
expire = self.date_created + lifetime
return expire
并且该模型具有过期属性。有没有办法让这个模型在过期后自行删除?
只需制作一个过滤器,即可防止检索过期的VerificationToken
s:
from datetime import timedelta
from django.db.models.functions import Now
VerificationToken.objects.filter(
date_created__gte=Now()-timedelta(minutes=10)
)
您还可以制作一个管理器,使VerificationToken.objects
是一个只包含未过期令牌的管理器:
from datetime import timedelta
from django.conf import settings
from django.db.models.functions import Now
classVerificationTokenManager(models.Manager):
def get_queryset(self):
return super().get_querset().filter(
date_created__gte=Now()-timedelta(minutes=10)
)
class VerificationToken(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
code = models.CharField(max_length=4)
date_created = models.DateTimeField(auto_now_add=True, db_index=True)
objects =VerificationTokenManager()
然后,您可以制作一个管理命令[Django-doc],例如,您可以通过cron或其他一些调度任务运行该命令,该任务使用删除过期的VerificationToken
# app_name/management/commands/remove_expired_tokens.py
from datetime import timedelta
from django.core.management.base import BaseCommand
from django.db.models.functions import Now
fromapp_name.models import VerificationToken
class Command(BaseCommand):
help = 'Remove expired verification tokens'
def handle(self, *args, **options):
VerificationToken._base_manager.filter(
date_created__lt=Now()-timedelta(minutes=10)
).delete()
注意:通常使用
settings.AUTH_USER_MODEL
[Django-doc]来引用用户模型比直接使用User
模型[Django-dc]更好。有关更多信息,请参阅文档中引用User
模型的部分。
我认为Django没有提供那种功能。您可以使用Celery创建一个Celery任务,该任务将删除在一定时间后过期的令牌。您还可以创建任务,定期查找过期的令牌并将其删除。
芹菜文档
不幸的是,这是不可能的。您可以做的是使用芹菜节拍或您喜欢的东西创建一个cronjob,并设置一个cronjob任务来清理过期的DB记录(每分钟/小时/天一次(