Отправить код активации по электронной почте после регистрации
Как мы видели на другом сайте, после регистрации он отправляет код активации 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)
И отправьте его по электронной почте. И вы можете сохранить точно такую же копию случайного числа. И когда пользователь даст свой номер. Вы можете сопоставить его с сохраненным. Если он совпадает, вы активируете профиль пользователя.