2016-11-13 178 views
0

我有以下Serializer来处理用户:Serializer.is_valid()始终是假

class FriendSerializer(serializers.Serializer): 

    login = serializers.CharField(max_length=15, required=True) 
    password = serializers.CharField(max_length=15, required=True) 
    mail = serializers.CharField(max_length=50, required=True) 

目前,我认为它处理POST请求注册一个新用户是一个基于Django的REST教程:

@api_view(['POST']) 
    def register_new_user(request): 

     if request.method == 'POST': 
      print('POST request !') 

      stream = BytesIO(request.body) 
      data = JSONParser().parse(stream) 

      print(data) 

      serializer = FriendSerializer(data=data) 

      print(serializer.is_valid()) 

     else: 
      print('Not a POST request!') 

     return HttpResponse('Nothing') 

因此,为了模拟一个客户端与POST请求,我使用下列行:

import requests 
import json 

json_data = json.dumps({'login': 'mylogin', 'password': 'mypassword', 'mail': 'mymail'}) 
r = requests.post('http://127.0.0.1:8000/register_new_user', json=json_data) 

然而,尽管print(data)检索,符合市场预期,

{"login": "mylogin", "mail": "mymail", "password": "mypassword"} 

serializer.is_valid()总是返回False

我是否缺少处理我的请求?

编辑:

我得到serializer.errors以下信息:

{'non_field_errors': ['Invalid data. Expected a dictionary, but got str.']} 

回答

1

你不必字典转换为字符串使用requests库的json选项时。这应该工作:

import requests 

data = {'login': 'mylogin', 'password': 'mypassword', 'mail': 'mymail'} 
r = requests.post('http://127.0.0.1:8000/register_new_user', json=data) 
0

的解决方案是使用ast.literal_eval(request.data)字符串转换为字典。我使用request.data而不是手动解析request.body

但是,v1k45的答案是最好的解决方案,因为在发送我的请求之前,我不需要将字典转换为字符串。