我有一个用户注册,其中用户的帐户被激活后,点击链接与令牌发送到他们的电子邮件地址。如果未在24小时内点击特定链接,我想使链接过期并从数据库中删除它们的数据。
我在一个地方看过它,48小时后链接已过期,这是正确的吗?
这是我的问题 -
如何在24小时内自动删除未点击激活链接的用户?
(到目前为止,我可以通过访问管理员面板并确认是否确认电子邮件)
这是我的激活功能,
def activate(request, uidb64, token):
try:
uid = force_text(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, ObjectDoesNotExist):
user = None
if user is not None and account_activation_token.check_token(user, token):
user.is_active = True
user.email_confirmed = True
user.save()
login(request, user)
return redirect('home')
else:
return render(request, 'user/account_activation_invalid.html')
这是我的tokens.py来创建令牌,
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.utils import six
class AccountActivationTokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return (
six.text_type(user.pk) +
six.text_type(timestamp) +
six.text_type(user.email_confirmed)
)
account_activation_token = AccountActivationTokenGenerator()
我应该改变什么才能实现这一目标?
令牌的默认到期时间为3天(72小时)。
您无需将令牌保存在数据库中。令牌已包含创建时间的时间戳。因此,您需要做的就是覆盖自定义类中的check_token
方法,并检查时间戳是否为24小时。
大多数代码都可以从原始方法中逐字复制。见source code on github。
你所要做的就是改变line 41
示例代码:
class AccountActivationTokenGenerator(...):
...
def check_token(self, user, token):
...
if (self._num_days(self._today()) - ts) > 1: # 1 day = 24 hours
return False
...
更新:
要在24小时后删除未经验证的用户,您可以创建一个每24小时运行一次的cron作业,并检查数据库中是否有未经验证的用户,如果超过24小时,则删除它们。
这是一个答案,概述了这个过程:Django - Set Up A Scheduled Job?。有关创建cron作业的信息,请参阅操作系统的文档。
添加cron作业的另一种方法是使用django应用程序,如django-cron和django-crontab。它们专门用于使此任务更容易,但一般原则保持与链接答案中描述的相同。