使用户激活链接过期并从django中的数据库中删除

问题描述 投票:0回答:1

我有一个用户注册,其中用户的帐户被激活后,点击链接与令牌发送到他们的电子邮件地址。如果未在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()

我应该改变什么才能实现这一目标?

python django django-views
1个回答
1
投票

令牌的默认到期时间为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-crondjango-crontab。它们专门用于使此任务更容易,但一般原则保持与链接答案中描述的相同。

© www.soinside.com 2019 - 2024. All rights reserved.