我正在使用django的tastypie。我有一行代码:
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
在反序列化行之前立即记录的日志消息将被成功记录,但是在反序列化行之后立即记录的日志消息将不会被记录,因此我非常确定反序列化是错误的。有谁知道什么可能是错的,或者我是否应该考虑其他问题?
答案 0 :(得分:5)
您的JSON无效。请检查here。 400(错误的请求)状态应该给你线索。它应该是:{"username": "user", "password": "password"}
。 Here你有一些解决方法如何在"
命令中转义CURL
char。不幸的是,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'])