【问题标题】:Django Rest Framework Error: JSON parse error - Expecting ':' delimiter: line 4 column 21 (char 103)Django Rest 框架错误:JSON 解析错误 - 需要 ':' 分隔符:第 4 行第 21 列(字符 103)
【发布时间】:2020-11-29 11:40:59
【问题描述】:

我想使用 DRF 中的 @api_view 装饰器通过 POST 请求保存新用户,但出现以下错误:

{
    "detail": "JSON parse error - Expecting ':' delimiter: line 4 column 21 (char 103)"
}

models.py 代码:

from django.db import models
from django.contrib.auth.models import User
from PIL import Image
from django.conf import settings

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    image = models.ImageField(default = 'users/default.jpg', upload_to = 'users/profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self,  **kwargs):
        super().save()
        img = Image.open(self.image.path)
        if img.height > 300 or img.width > 300:
            output_size = (300, 300)
            img.thumbnail(output_size)
            img.save(self.image.path)

views.py 代码:

from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.http import HttpResponse, JsonResponse
from rest_framework.parsers import JSONParser
from .serializers import UserSerializer
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status

@api_view(['GET', 'POST'])
def user_list(request):

    if request.method == 'GET':
        users = User.objects.all().order_by('id')
        serializer = UserSerializer(users, many = True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = UserSerializer(data = request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status = status.HTTP_201_created)
        return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST)

serializers.py 代码:

from rest_framework import serializer
from django.contrib.auth.models import User
from .models import Profile
from django.contrib.auth.hashers import make_password


class UserSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only = True)
    password = serializers.CharField(
        required = False,
        write_only = True,
        style = {"input_type": "password", "placeholder": "Password"}
    )
    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'password']

    def create(self, validated_data):
        validated_data['password'] = make_password(validated_data.get('password'))
        return super(UserSerializer, self).create(validated_data)

urls.py 代码:

from django.urls import path, include
from .views import user_list, user_detail
from rest_framework import routers


urlpatterns = [
    path('users/', user_list),
    path('users/<int:pk>/', user_detail),
]

我正在从头开始学习 DRF,并相应地遵循文档。我不确定为什么会在这里收到 HTTP 400 Bad Request 错误。如果有人能帮助我,那就太好了。

这是我的 POST 请求的示例:

{
    "username": "user_1",
    "email": "user1m@gmail.com",
    "password" : "testing1234"
}

ID 自动递增且需要密码(如 serializer.py 代码中所述)

【问题讨论】:

  • 您尝试发送的 JSON 是什么样子的
  • @iklinac 现在请检查我的问题,我已在示例 JSON 代码中添加。
  • 即使这不是有效的 JSON,但您在使用 POST 时遇到问题,所以为什么要添加 GET 请求 JSON
  • @iklinac 抱歉,我将其更改为 POST 请求。为什么它不是一个有效的 JSON?

标签: python django django-rest-framework


【解决方案1】:

你应该这样发帖:

{
    "username": "user_1",
    "email": "user1m@gmail.com",
    "password" : "testing1234"
}

【讨论】:

  • 这是一个复制粘贴错误,我已经更正了。
猜你喜欢
  • 1970-01-01
  • 2021-07-21
  • 2022-07-05
  • 1970-01-01
  • 2020-11-21
  • 2018-08-09
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多