Плохой запрос Python Django при регистрации пользователя и подтверждении электронной почты
Итак, я реализовал класс регистрации пользователя, и он работал нормально, затем попробовал отправить подтверждение по электронной почте через Send Grid, которое также работало нормально. Затем я добавил несколько условий.
В основном, рабочий процесс выглядит так:
- Пользователь регистрируется, отправляя соответствующую информацию. Поле 'is_active' изначально устанавливается в False .
- Затем из запроса создается объект PatientSerializer, который сохраняется в базе данных, если он действителен.
- Создается токен через библиотеки для проверки адреса электронной почты
- Создал объект TokenSerializer, передав ему ID в запросе и токен, созданный в (3), и сохранил его, если он действителен
- В том же блоке if было создано сообщение через SendGrid API и отправлено пользователю .
- Затем остаются только операторы except и else для отлова ошибок
Мой файл models.py:
from django.db import models
from django.contrib.auth.models import User
class Token(models.Model):
user = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='token')
token = models.CharField(max_length=256, blank=True, null=True)
Мой файл serializer.py:
from pyexpat import model
from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework.validators import UniqueValidator
from rest_framework_jwt.settings import api_settings
from .models import Token
class TokenSerializer(serializers.ModelSerializer):
class Meta:
model = Token
fields = ('user', 'token',)
class PatientSerializer(serializers.ModelSerializer):
token = serializers.SerializerMethodField()
email = serializers.EmailField(
required=True,
validators=[UniqueValidator(queryset=User.objects.all())]
)
username = serializers.CharField(
required=True,
max_length=32,
validators=[UniqueValidator(queryset=User.objects.all())]
)
first_name = serializers.CharField(
required=True,
max_length=32
)
last_name = serializers.CharField(
required=True,
max_length=32
)
# DOB = serializers.DateField(
# required=True
# )
# gender = serializers.CharField(
# required=True
# )
# address = serializers.CharField(
# required=True,
# max_length=60
# )
# contactNo = serializers.IntegerField(
# required=True,
# max_length=11
# )
password = serializers.CharField(
required=True,
min_length=8,
write_only=True
)
def create(self, validated_data):
password = validated_data.pop('password', None)
instance = self.Meta.model(**validated_data)
if password is not None:
instance.set_password(password)
instance.save()
return instance
def get_token(self, obj):
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(obj)
token = jwt_encode_handler(payload)
return token
class Meta:
model = User
fields = (
'token',
'username',
'password',
'first_name',
'last_name',
'email',
'is_active',
# 'DOB',
# 'address',
# 'contactNo',
'id'
)
Мой файл views.py:
Запрос почтальона выглядит следующим образом:
Командная строка:
База данных Sqlite3:
Вы видите, что информация сохраняется, но по какой-то причине он полностью пропускает часть отправки электронной почты и печатает только ответ о плохом запросе. Почему так происходит?
P.S. Я скрыл ключ API здесь, но это часть моего кода.
Я думаю, что полезная нагрузка POST-запроса не подтверждена PatientSerializer
.
Поле token
должно быть установлено как только для чтения.
class PatientSerializer(serializers.ModelSerializer):
token = serializers.SerializerMethodField(read_only = True)
...