django - "This field is required."DRF

标签 django authentication django-rest-framework jwt django-registration

开始处理DRF。我想使用 jwt token 对用户进行身份验证。但什么也没发生。我遇到了创建用户时出现的问题:{"user": {"email": ["此字段是必填的。"], "Username": ["此字段是必填的。 "], "Password": ["此字段是必填字段。"]}}。 尽管所有字段都已填写。

模型

class UserManager(BaseUserManager):
    def create_user(self, username, email, password=None):
        if username is None:
            raise TypeError('Users must have a username.')
​
        if email is None:
            raise TypeError('Users must have an email address.')
​
        user = self.model(username=username, email=self.normalize_email(email))
        user.set_password(password)
        user.save()

        return user
​
​
class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(db_index=True, max_length=255, unique=True)
    email = models.EmailField(db_index=True, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    bio = RichTextUploadingField(_('bio'), blank=True)
    city = models.CharField(_('city'), max_length=100, blank=True)
​
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
​
    objects = UserManager()
​
    @property
    def token(self):
        return self._generate_jwt_token()
​
    def _generate_jwt_token(self):
        dt = datetime.now() + timedelta(days=60)
​
        token = jwt.encode({
            'id': self.pk,
            'exp': int(dt.strftime('%s'))
        }, settings.SECRET_KEY, algorithm='HS256')

        return token.decode('utf-8')

序列化器

class RegistrationSerializer(serializers.ModelSerializer):
    password = serializers.CharField(
        max_length=128,
        min_length=8,
        write_only=True
    )
    token = serializers.CharField(max_length=255, read_only=True)
​
    class Meta:
        model = User
        fields = ['email', 'username', 'password', 'token']

​
    def create(self, validated_data):
        return User.objects.create_user(**validated_data)

查看

class RegistrationAPIView(APIView):
    permission_classes = (AllowAny,)
    renderer_classes = (UserJSONRenderer,)
    serializer_class = RegistrationSerializer
​
    def post(self, request):
        print('request.data: \t\t', request.data)         #<QueryDict: {'{\n    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="780b190b190b190b380b190b190b560b0b190b" rel="noreferrer noopener nofollow">[email protected]</a>",\n    "username": "sasasasas",\n    "password": "12345678"\n}': ['']}>
        print('request.data.get("user", {}): \t', request.data.get('user', {}))            #{}
        user = request.data.get('user', {})
​
        serializer = self.serializer_class(data=user)
        serializer.is_valid(raise_exception=True)     #Error
        serializer.save()
​
        return Response(serializer.data, status=status.HTTP_201_CREATED)

最佳答案

我没有详细阅读本教程,但似乎由于某种原因,您发布到端点的有效负载应该与 DRF 通常期望的形状不同。

There is one thing we need to fix though. Notice how the response from the "Register" request has all of the user's information at the root level. Our client expects this information to be namespaced under "user." To do that, we'll need to create a custom DRF renderer.

所以不要发布这个:

{ 
  "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6e1b1d0b1c2e0b160f031e020b400d0103" rel="noreferrer noopener nofollow">[email protected]</a>",
  "username": "user",
  "password": "hunter2"
}

您必须将其全部嵌套在“user”键下。

{
  "user": { 
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6e1b1d0b1c2e0b160f031e020b400d0103" rel="noreferrer noopener nofollow">[email protected]</a>",
    "username": "user",
    "password": "hunter2"
  }
}

关于django - "This field is required."DRF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57153716/

相关文章:

spring security permitAll 仍在考虑在 Authorization header 中传递的 token ,如果 token 无效则返回 401

django - 如何在 DRF View 中调用函数?

django sitemap.xml 文档与原始站点地图文档相矛盾

Django休息框架: How to set a field to null via PATCH request?

远程连接到 JBoss 4.2.3 中的身份验证

php - 用户登录脚本: Users can login with any username and password

Django OAuth 工具包设置问题

python - 所有响应的 Django REST 框架自定义格式

python - 添加一个图标到 django 脆皮表单提交按钮

python - django 中的分组依据、不同值、计数