本文共 4408 字,大约阅读时间需要 14 分钟。
学习Django REST framework,文档参考。
我们需要创建serializer来将我们自己的数据结构和一些文件格式(例如JSON)之间进行转换。创建一个serializer需要从rest_framework的serializers.Serializer类派生。
from rest_framework import serializers
实现serializers.Serializer类的create()和update()方法。
serializers package中设计有serializers.IntegerField(),serializers.CharField(),serializers.ChoiceField()的类型,和Django的Form很相似,并且各个类的构造函数支持required, max_length, default等参数。
一个serializer将python对象转换为python内置类型,存储于data成员变量中,可以通过JSONRender().render()函数输出成JSON格式。从JSON文件还原成python内置类型,用JSONParser().parse()函数。
from django.utils.six import BytesIOstream = BytesIO(content)data = JSONParser().parse(stream)
is_valid()函数,validated_data成员变量,save()函数(输出一个python对象,既serializer的目标类型)。
一个serializer可以序列化多个对象,调用构造函数时使用参数many=True指定处理多个对象。
使用ModelSerializer来简化创建基于Model的serializer。
class SerializerClass(serializers.ModelSerializer): class Meta: model = YourModel fields = ('all', 'the', 'fields', 'of', 'YourModel')
此时有用的package包括
from django.http import HttpResponse, JsonResponsefrom django.views.decorators.csrf import csrf_exemptfrom rest_framework.renderers import JSONRendererfrom rest_framework.parsers import JSONParser
可使用JsonResponse(serializer.data, safe=False)来返回一个Json相应。或者创建一个新的对象。
if request.method == 'POST': data = JSONParser().parse(request) serializer = SerializerClass(data=data) if serializer.is_valid(): serializer.save() return JsonResponse(serializer.data, status=201) return JsonResponse(serializer.errors, status=400)调试时注意使用@csrf_exempt修饰。
REST提供了Request对象,比HttpRequest对象更高级。request.data成员变量能够处理POST,PUT和PATCH的数据。
REST提供了Response对象。可以返回client需要的格式(通过content negotiation)。使用REST自定好的status code (例如status.HTTP_400_BAD_REQUEST)。
REST提供了@api_view作为对function base view的修饰。提供了APIView基类作为clasee-based view的基类。
from rest_framework import statusfrom rest_framework.decorators import api_viewfrom rest_framework.response import Response
参考文档上的实例:
@api_view(['GET', 'POST'])def snippet_list(request): """ List all code snippets, or create a new snippet. """ if request.method == 'GET': snippets = Snippet.objects.all() serializer = SnippetSerializer(snippets, many=True) return Response(serializer.data) elif request.method == 'POST': serializer = SnippetSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)注意对的支持。
from rest_framework.views import APIView从APIView派生,并实现get()和post()方法。get()和post()方法支持format参数,默认值应为None,。
神奇的mixins。
List类型的view。
from snippets.models import Snippetfrom snippets.serializers import SnippetSerializerfrom rest_framework import mixinsfrom rest_framework import genericsclass SnippetList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs)
Detail类型的view。
class SnippetDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)
from snippets.models import Snippetfrom snippets.serializers import SnippetSerializerfrom rest_framework import genericsclass SnippetList(generics.ListCreateAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializerclass SnippetDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Snippet.objects.all() serializer_class = SnippetSerializer
需要如下package
from rest_framework import permissions对于基于类的view设计,在view类中需要类似于下方的变量。
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
转载地址:http://ipugf.baihongyu.com/