Удалите ссылку активации пользователя и удалите из базы данных в django - PullRequest
0 голосов
/ 15 марта 2019

У меня есть регистрация пользователя, когда учетная запись пользователя активируется после нажатия на ссылку с токеном, отправленной на его адрес электронной почты. Я хочу, чтобы истечь ссылка и удалить свои данные из базы данных, если конкретная ссылка не была нажата в течение 24 часов.

Я прочитал в одном месте, что срок действия ссылки истек через 48 часов, это правильно?

Вот мой вопрос -

Как я могу автоматически удалить тех пользователей, которые не нажимают на ссылку активации в течение 24 часов?

(Пока я могу это сделать, зайдя в админ-панель и проверив, подтвержден ли email или нет)

Вот моя функция активации,

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 Ответ

1 голос
/ 15 марта 2019

Срок действия токена по умолчанию составляет 3 дня (72 часа).

Вам не нужно сохранять токен в базе данных. Маркер уже содержит временную метку времени создания. Поэтому все, что вам нужно сделать, это переопределить метод check_token в вашем пользовательском классе и проверить, является ли отметка времени 24-часовой или нет.

Большая часть кода может быть скопирована дословно из оригинального метода. Смотрите исходный код на github .

Все, что вам нужно сделать, это изменить строка 41

Пример кода:

class AccountActivationTokenGenerator(...):
    ...
    def check_token(self, user, token):

        ...
        if (self._num_days(self._today()) - ts) > 1: # 1 day = 24 hours
            return False

        ...

UPDATE:

Чтобы удалить непроверенных пользователей через 24 часа, вы можете создать задание cron, которое будет запускаться каждые 24 часа, проверять вашу базу данных на наличие непроверенных пользователей и удалять их, если им больше 24 часов.

Вот ответ, который дает общее представление о процессе: Django - Настроить запланированное задание? . Для создания задания cron см. Документацию вашей операционной системы.

Еще один метод добавления заданий cron - использование приложений django, таких как django-cron и django-crontab . Они специально созданы для облегчения этой задачи, но общий принцип остается таким же, как описано в связанном ответе.

...