【发布时间】:2020-03-23 13:34:15
【问题描述】:
当我尝试向我的 API 端点发出 POST 请求以在我的用户表中创建一个用户时,我收到了神秘的序列化程序错误。该错误表明需要email、password、codename(创建用户需要 3 个字符串)。但我正在发送所有三个字符串。这是因为序列化程序无效(转到serializers.py,if serializer.is_valid() 检查)...但我不知道为什么它无效。
整个说的错误信息:
{'codename': [ErrorDetail(string=u'This field is required.', code=u'required')], 'password': [ErrorDetail(string=u'This field is required.', code=u'required')], 'email': [ErrorDetail(string=u'This field is required.', code=u'required')]}
所有这些文件都在我的 Django 目录中的 users 文件夹中。
serializers.py:
from rest_framework import serializers
from .models import User
class UserPostSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('email', 'password', 'codename')
views.py:
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status
from .serializers import *
from .models import User
from argon2 import PasswordHasher
import json
@api_view(['POST'])
def create_user(request):
print("inside create_user")
""" POST = Create user. """
data = {}
# print("request.data:\n", request.data)
serializer = UserPostSerializer(data=request.data)
print("got serializer")
if serializer.is_valid():
print("serializer is valid!")
email = serializer.data['email']
codename = serializer.data['codename']
password = serializer.data['password']
user = User.objects.filter(email=email)
if not user:
# Apply Argon2
ph = PasswordHasher()
hash = ph.hash(password)
# Create user
new_user = User(email=email, password=hash, codename=codename)
new_user.save()
request.session['email'] = email
request.session['id'] = new_user.pk
print(request.session['email'], "has logged in!")
print(request.session['id'], "user's id")
return Response(serializer.data, status=status.HTTP_200_OK)
# User with this email found... Please login...
else:
return Response(status=status.HTTP_409_CONFLICT)
else:
print(serializer.errors)
return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
models.py:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class User(models.Model):
email = models.CharField(max_length=255, blank=False)
codename = models.CharField(max_length=255, blank=False)
password = models.CharField(max_length=255, blank=False)
profilePic = models.ImageField(upload_to='images/', blank=True)
【问题讨论】:
-
如何发送 POST 请求?
-
我使用 Postman,我发送一个 JSON 字典。例如:
{'email':'fake@gmail.com', 'password':'password', 'codename':'sneakyboi'} -
print("request.data:\n", request.data)打印什么? -
它打印:
('request.data:\n', <QueryDict: {u"{\n'email':'pizza@gmail.com',\n'password':'password',\n'codename':'sneakyass'\n}": [u'']}>)(我更改了 POST 请求,所以它与上面的不同)
标签: python django postgresql serialization