2016-11-13 179 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的答案是最好的解決方案,因爲在發送我的請求之前,我不需要將字典轉換爲字符串。