Плохой запрос Python Django при регистрации пользователя и подтверждении электронной почты

Итак, я реализовал класс регистрации пользователя, и он работал нормально, затем попробовал отправить подтверждение по электронной почте через Send Grid, которое также работало нормально. Затем я добавил несколько условий.

В основном, рабочий процесс выглядит так:

  1. Пользователь регистрируется, отправляя соответствующую информацию. Поле 'is_active' изначально устанавливается в False
  2. .
  3. Затем из запроса создается объект PatientSerializer, который сохраняется в базе данных, если он действителен.
  4. Создается токен через библиотеки для проверки адреса электронной почты
  5. Создал объект TokenSerializer, передав ему ID в запросе и токен, созданный в (3), и сохранил его, если он действителен
  6. В том же блоке if было создано сообщение через SendGrid API и отправлено пользователю
  7. .
  8. Затем остаются только операторы 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:

Запрос почтальона выглядит следующим образом:

enter image description here

Командная строка:

enter image description here

База данных Sqlite3:

enter image description here

Вы видите, что информация сохраняется, но по какой-то причине он полностью пропускает часть отправки электронной почты и печатает только ответ о плохом запросе. Почему так происходит?

P.S. Я скрыл ключ API здесь, но это часть моего кода.

Я думаю, что полезная нагрузка POST-запроса не подтверждена PatientSerializer. Поле token должно быть установлено как только для чтения.

class PatientSerializer(serializers.ModelSerializer):

    token = serializers.SerializerMethodField(read_only = True)
    ...
Вернуться на верх