Отправить код активации по электронной почте после регистрации

Как мы видели на другом сайте, после регистрации он отправляет код активации 6/5 в нашем электронном письме. И мы используем этот код активации для активации нашей учетной записи. Я пытаюсь сделать то же самое, но не могу понять, как это сделать в django-rest-framework

В настоящее время я использую Djoser для регистрации и активации. Djoser отправляет активационный адрес в письме, и он работает нормально. Как я могу заменить URL активации кодом активации из 6 буквенно-цифровых символов для активации аккаунта?

Использую: Django-Rest-Framework, Django-Rest-Fraework-JWT, Djoser

2 ответа

В проектах я использовал следующие варианты:

# models.py
import random

from django.conf import settings
from django.db import models


def generate_activation_code():
    return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(6))


class ActivationCode(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
    code = models.CharField(max_length=6, default=generate_activation_code)


# views.py
from django.http import Http404

def register_user(request):
    # create your `new_user` however you see fit
    code = ActivationCode.objects.create(user=new_user)
    send_mail(
        'Activate Your Account',
        'Here is the activation code: %s' % code,
        'from@example.com',
        [user.email]
    )
    render(request, 'activation_sent.html')

def check_activation_code(request, code):
    try:
        ActivationCode.objects.get(code=code)
        # ... All set, activate & login the user, & delete the activation code
    except ActivationCode.DoesNotExist:
        raise Http404

    return render(request, 'welcome.html')

Улучшения могут включать добавление срока годности к ActivationCode которые вы проверяете в представлении и / или управленческое задание по очистке старых кодов.

Вместо того, чтобы создавать случайное значение, закодируйте некоторые уникальные пользовательские данные и добавьте их в URL. как это

import jwt
data = {'email' : "test@test.com"} # Some unique field for reference
secret_key = "test"
algorithm = "HS256" # You can use MD5 or whatever you want
jwt.encode(data, secret_key, algorithm)

После того, как они нажмут URL активации почты, вы сможете расшифровать и проверить уникальное поле в базе данных. Для этого вы не хотите сохранять код в БД. Это мое предложение

Вы можете сгенерировать случайное число из 6 цифр:

import random  
codeval = random.randint(111111,999999)

И отправьте его по электронной почте. И вы можете сохранить точно такую ​​же копию случайного числа. И когда пользователь даст свой номер. Вы можете сопоставить его с сохраненным. Если он совпадает, вы активируете профиль пользователя.

Другие вопросы по тегам