使用户激活链接过期并从Django中

时间:2019-03-15 10:43:27

标签: python django django-views

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

要实现这一目标,我应该改变什么?

1 个答案:

答案 0 :(得分: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小时后删除未验证的用户,您可以创建一个cron作业,该作业每24小时运行一次,并检查数据库中是否有未验证的用户,并删除超过24小时的用户。

以下是给出该过程概述的答案:Django - Set Up A Scheduled Job?。有关创建cron作业的信息,请参见操作系统的文档。

添加cron作业的另一种方法是使用django应用程序,例如django-crondjango-crontab。它们是专门为简化此任务而创建的,但一般原理与链接答案中所述的相同。