【发布时间】: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