Python 终止用户激活链接并从django中的数据库中删除

Python 终止用户激活链接并从django中的数据库中删除,python,django,django-views,Python,Django,Django Views,我有一个用户注册,用户的帐户被激活后,与令牌发送到他们的电子邮件地址的链接被点击。如果在24小时内未单击特定链接,我希望使链接过期并从数据库中删除他们的数据 我在一个地方读到,链接在48小时后过期,对吗 这是我的问题- 如何在24小时内自动删除未点击激活链接的用户 (到目前为止,我可以通过进入管理面板并检查电子邮件是否已确认来做到这一点) 这是我的激活功能 def activate(request, uidb64, token): try: uid = force_text

我有一个用户注册,用户的帐户被激活后,与令牌发送到他们的电子邮件地址的链接被点击。如果在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')
这是my 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\u token
方法,并检查时间戳是否为24小时

大多数代码都可以从原始方法中逐字复制。看

你所要做的就是改变

示例代码:

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小时,则将其删除

下面是一个答案,它给出了流程的概要:。要创建cron作业,请参阅操作系统的文档


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

一种通用方法是创建一个
crontab
,执行django
命令
,以删除符合
过滤器标准的任何激活链接(时间戳
。一天后到期。但这并不会自动删除用户。关于这方面有什么事吗?@BidhanMajhi啊!你问题的标题把我弄糊涂了。我已经用更多信息更新了答案。@xyres在不到一个小时的时候可以检查一下吗?比如
if(self.\u num\u days(self.\u today())-ts)>0.04:#24小时中的1小时是0.042返回False
@m00ncake No.
self.\u today()
ts
都是
日期
对象。减去它们将返回
天的值作为一个整数。由于令牌中使用的时间戳(
ts
)只有日期信息,因此您需要覆盖令牌生成方法,并使用小时和分钟信息(即
datetime
对象)保存时间戳。