我是通过通过Android应用发送包含用户名,密码和电子邮件ID的请求的Android应用程序来创建用户的。现在,在我的应用中,有两种用户,即教师和学生。现在,为了在注册期间区分老师和学生,我想将验证电子邮件发送给由随机生成的令牌组成的老师。现在,我希望老师在注册期间输入这个令牌,以验证实际上,老师正在注册,而不是一些顽皮的学生,他们只是想和所有人混在一起。我能够发送包含令牌的电子邮件,但无法理解当老师在注册时输入该应用程序时,我将如何验证它,并与发送到电子邮件ID的令牌进行匹配。 <</strong> <</strong>
以下是我的序列化器的代码,用于发送包含令牌的电子邮件
class UserSerializer(serializers.ModelSerializer):
token = serializers.CharField(max_length=100, null=True, blank=True)
class Meta:
model = User
fields = ('id', 'username', 'password', 'email', 'token')
def create(self, validated_data):
user = User(username=validated_data['username'],
email=validated_data['email'])
user.set_password(validated_data['password'])
user.save()
subject = "Email verification for django"
message = account_activation_token.make_token(user)
send_mail(subject, message, settings.EMAIL_HOST_USER,
[user.email])
return user
您可以看到,在上述代码中,我正在生成随机令牌并在收到创建新用户的发布请求时发送电子邮件。现在,我的用户将在应用程序中的电子邮件中输入令牌,并发送帖子请求。现在,我想检查用户输入的令牌是否与代码中上面生成的令牌相同,以便我可以验证用户并继续使用注册表单。
ps:我的用户模型不包含令牌字段,因为我使用 in InstoRuilt用户模型由DJANGO提供并将其连接到 conters 使用一对一的场地
模型PPS:我有其他方法可以用来实现上述功能?
您需要将令牌保存在您的身边(数据库(,以将其与教师输入您的表格中的一个匹配。因此,先制作模型。
class Token(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
token = models.CharField(max_length=255)
生成令牌的行是在创建用户之后出现的,因此您可以使用用户实例并将令牌保存到刚创建的模型:
def create(self, validated_data):
...
message = account_activation_token.make_token(user)
Token.objects.create(user=user, token=message)
send_mail(subject, message, settings.EMAIL_HOST_USER,
...
接下来,您在视图中使用以下代码检查用户是否输入了正确的令牌:
...
token_obj = Token.objects.get(user=user)
user_token = token_obj.token
if form.data['token'] == user_token:
# code to accept the user
token_obj.delete() # this deletes the row since you will not use it anymore
else:
# code to reject the user
注意:请不要复制粘贴这些代码。相应调整。
我宁愿使用 def validate_*
,其中 *可以是任何字段(对于字段级验证(,如DRF DOCS:
from django.core.exceptions import ValidationError
from django.core.validators import validate_email
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer
from .models import SomeModel
class SomeModelSerializer(ModelSerializer):
class Meta:
model = SomeModel
fields = (
"email",
"password",
)
def create(self, validated_data):
user = SomeModel.objects.create_user(**validated_data)
return user
def validate_email(self, email):
try:
validate_email(email)
except ValidationError:
raise serializers.ValidationError('email is invalid')
return email