博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django + REST学习笔记
阅读量:2135 次
发布时间:2019-04-30

本文共 4408 字,大约阅读时间需要 14 分钟。

学习Django REST framework,文档参考。

Serialization

我们需要创建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修饰。

Request and Response

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)
注意对的支持。

Class-Based Views

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)

Generic class-based view

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

Authentication & Permissions

需要如下package

from rest_framework import permissions
对于基于类的view设计,在view类中需要类似于下方的变量。
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

转载地址:http://ipugf.baihongyu.com/

你可能感兴趣的文章
第一篇 HelloWorld.java重新学起
查看>>
ORACLE表空间扩张
查看>>
orcal 循环执行sql
查看>>
web.xml配置监听器,加载数据库信息配置文件ServletContextListener
查看>>
结构型模式之桥接模式(Bridge)
查看>>
行为型模式之状态模式(State)
查看>>
行为型模式之策略模式(Strategy)
查看>>
行为型模式之模板方法模式(TemplateMethod)
查看>>
行为型模式之访问者模式(Visitor)
查看>>
大小端详解
查看>>
source insight使用方法简介
查看>>
<stdarg.h>头文件的使用
查看>>
C++/C 宏定义(define)中# ## 的含义 宏拼接
查看>>
Git安装配置
查看>>
linux中fork()函数详解
查看>>
C语言字符、字符串操作偏僻函数总结
查看>>
Git的Patch功能
查看>>
分析C语言的声明
查看>>
TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手
查看>>
C结构体、C++结构体、C++类的区别
查看>>