我不得不使用django-rest-framework进行简单的RESTful测试。我是新手。请帮忙。提前谢谢!
django> = 1.9
djangorestframework 3.3.3
python 3.4.3
curl -H“Content-Type:application / json”-X POST -d'{“title”:“xyz”,“desc”:“xyz”}'http://localhost:3000/api/test/
INSTALLED_APP = {
'app',
'rest_framework',
#....skip to keep it short
}
# did not set anything
<!-- language-all: lang-python -->
REST_FRAMEWORK = {
}
class Test(object):
def __init__(self, title, desc):
self.title = title
self.desc = desc
from rest_framework import serializers
class TestSerializer(serializers.Serializer):
title = serializers.CharField()
desc = serializers.CharField(max_length=200)
class Meta:
model = Test
fields = ('title', 'desc')
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
@csrf_exempt
class TestView(APIView):
def get(self, request, format=None):
# 1. we use NoSQL, is the following line still work?
# testItems = Test.objects.all()
serializer = SnippetSerializer(testItems, many=True)
return Response(serializer.data)
def post(self, request, format=None):
# 2. Unable to get any json string in request object or request.data at all!
# 3. The entire json seems disappear and get dropped
serializer = TestSerializer(data=request.data)
if serializer.is_valid():
# 4. can save() be overrided and do custom implementation? How?
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
from django.conf.urls import patterns, url
urlpatterns = patterns(
'app',
url(r'^api/business/$', app.views.TestView.as_view()),
)
答案 0 :(得分:1)
我不了解NOSQL,但你可以在shell上测试它。我猜它可能有用。 关于request.data错误; request.data仅用于使用django rest框架上传文件。当你发布一个json时,它就在请求的主体中。在你看来,你应该做的是这样的事情:
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
import json
@csrf_exempt
class TestView(APIView):
# your get request here.
def post(self, request, format=None):
body_unicode = request.body.decode('utf-8')
data = json.loads(body_unicode)
# Now, your json content is stores in data as a dictionary.
serializer = TestSerializer(data=request.data)
if serializer.is_valid():
# 4. can save() be overrided and do custom implementation? How?
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
仅供参考,我使用序列化器来创建json,我不使用它来创建对象。因此,我不确定此版本%100是否有效。但我很确定我添加的2行将JSON转换为字典。如果序列化程序接受字典作为数据,它将起作用。