2014-02-15 4 views
3

Я использую tastypie с django. У меня есть одна строка кода:Tastypie deserialize results in {"error": ""}

data = self.deserialize(request, request.body, format=request.META.get('CONTENT_TYPE', 'application/json')) 

Я использую этот код из командной строки, чтобы отправить пост запрос на мой веб-сервер:

curl -X post -d "{ 'username' : 'user', 'password' : 'password' }" http://127.0.0.1:8000/api/employee/login/ --header "Content-Type:application/json" 

Когда я запускаю это, приводит в ответ JSon из

{"error": ""} 

Глядя на мои логи сервера я вижу:

[15/Feb/2014 20:39:49] "post /api/user/login/ HTTP/1.1" 400 13 

Сообщение журнала, зарегистрированное непосредственно перед тем, как строка десериализации будет успешно зарегистрирована, но сообщение журнала, зарегистрированное сразу после того, как строка десериализации не будет зарегистрирована, поэтому я уверен, что десериализация неверна. Кто-нибудь знает, что может быть неправильным, или если я должен рассматривать что-то еще как проблему?

ответ

5

Ваш JSON недействителен. Пожалуйста, проверьте его here. Статус 400 (плохой запрос) должен дать вам понять об этом. Это должно быть: {"username": "user", "password": "password"}. Here у вас есть некоторые решения, как избежать " char в команде CURL. Tastypie, к сожалению, вызывает исключение без сообщения здесь, но мы можем легко исправить это для будущего, чтобы сэкономить время для других людей, которые будут использовать ваш API.

from tastypie.exceptions import BadRequest 
from tastypie.serializers import Serializer 
class VerboseSerializer(Serializer): 
    """ 
    Gives message when loading JSON fails. 
    """ 
    # Tastypie>=0.9.6,<=0.11.0 
    def from_json(self, content): 
     """ 
     Override method of `Serializer.from_json`. Adds exception message when loading JSON fails. 
     """ 
     try: 
      return json.loads(content) 
     except ValueError as e: 
      raise BadRequest(u"Incorrect JSON format: Reason: \"{}\" (See www.json.org for more info.)".format(e.message)) 

class MyResource(BaseModelResource): 
    class Meta: 
     serializer = VerboseSerializer(formats=['json']) 
+0

Я столкнулся с этим «именем» Сериализатор «не определен». Спасибо –

+0

вышеупомянутая проблема исправлена ​​после импорта «Serializer» из «tastypie.serializers». –