• rest_framework基础


    rest_framework基础

     

    简介

    为什么要使用REST framework?

    Django REST framework 是一个强大且灵活的工具包,用以构建Web APIs。  

    在线可视的API,对于赢得你的开发者们十分有用 
    验证策略涵盖了OAuth1aOAuth2 
    - 同时支持ORM非ORM数据源的序列化 
    - 可以配置各个环节,若无需更多强大特性,使用一般基于类(function-based)的视图(views)即可 
    大量的文档,强力的社区支持 
    - 大公司如同MozillaEventbrite,也是忠实的使用者

    配置要求

    REST framework 有以下的要求:

    • Python (2.7, 3.2, 3.3, 3.4, 3.5)
    • Django (1.7+, 1.8, 1.9)

    下面是可选的包:

    • Markdown (2.1.0+) - Markdown为可视化 API 提供了支持.
    • django-filter (0.9.2+) - 过滤支持.
    • django-crispy-forms - 为过滤,提供了改良的HTML呈现.
    • django-guardian (1.1.1+) - 对象层面的权限支持.

    安装与配置

    安装

    1
    2
    3
    pip install djangorestframework
    pip install markdown     # 可选依赖包
    pip install django-filter  # 可选依赖包

    配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSTALLED_APPS = (
        ...
        'rest_framework',
    )
     
     
    REST_FRAMEWORK = {
        # 编码格式 
        'UNICODE_JSON'False,
    }

    基本使用方法

    models.py

    1
    2
    3
    4
    5
    6
    7
    from django.db import models
     
    class Author(models.Model):
        name=models.CharField(max_length=32)
        age=models.IntegerField()
        def __str__(self):
            return self.name

    urls.py

    1
    2
    3
    4
    5
    6
    7
    8
    from django.conf.urls import url
    from django.contrib import admin
    from rest_demoimport views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^authors/$', views.AuthorsView.as_view()),
        url(r'^authors/(d+)/$', views.AuthorsDetailView.as_view()),
    ]

    serializer.py

    1
    2
    3
    4
    5
    6
    7
    from rest_framework import serializers
    from rest_demo import models
     
    class AuthorModelSerializers(serializers.ModelSerializer):
        class Meta:
            model = models.Author
            fields = '__all__'

    views.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    from rest_demo import serializer
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_demo import models
     
    class AuthorsView(APIView):
        def get(self,request):
            '''
            查询所有作者
            :param request:
            :return:
            '''
            author_list = models.Author.objects.all()
            auts = serializer.AuthorModelSerializers(author_list,many=True)
            return Response(auts.data)
     
     
        def post(self,request):
            '''
            添加作者
            :param request:
            :return:
            '''
            auts = serializer.AuthorModelSerializers(data=request.data)
            if auts.is_valid():
                auts.save()
                return Response(auts.data)
            return Response(auts.errors)
     
     
    class AuthorsDetailView(APIView):
        def get(self,request,id):
            '''
            查询单条作者
            :param request:
            :param id:
            :return:
            '''
            author = models.Author.objects.filter(pk=id).first()
            auts = serializer.AuthorModelSerializers(author)
            return Response(auts.data)
     
     
        def put(self,request,id):
            '''
            修改单条作者
            :param request:
            :param id:
            :return:
            '''
            author = models.Author.objects.filter(pk=id).first()
            auts = serializer.AuthorModelSerializers(instance=author,data=request.data)
            if auts.is_valid():
                auts.save()
                return Response(auts.data)
            return Response(auts.errors)
     
     
        def delete(self,request,id):
            '''
            删除单条作者
            :param request:
            :param id:
            :return:
            '''
            models.Author.objects.filter(pk=id).delete()
            return Response()

      

    封装

    继承mixin包下面的类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    from rest_framework import mixins
    from rest_framework import generics
    class PublishView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):
        queryset = models.Publish.objects.all()
        serializer_class = serializer.PublishSerializers
     
        def get(self,request,*args,**kwargs):
            return self.list(request,*args,**kwargs)
     
        def post(self,request,*args,**kwargs):
            return self.create(request,*args,**kwargs)
     
     
    class PublishDetailView(mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin,generics.GenericAPIView):
        queryset = models.Publish.objects.all()
        serializer_class = serializer.PublishSerializers
     
        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)

      这个时候,我们只需要提供queryset和serializer_class两个参数配置,mixin包下面的类会帮我们处理数据,我们调用对应的方法并且将其返回值返回即可,

    但是需要注意的是,如果使用此方法,urls.py的url对应的id要命名为pk,如下:

    1
    2
    url(r'^publishes/$', views.PublishView.as_view()),
    url(r'^publishes/(?P<pk>d+)/$', views.PublishDetailView.as_view()),

      但是,即使我们用了这种封装,很多代码还是有重复的,所有,rest_framework又给我们做了一层封装

    继承generices包下面的类

    只需要改变一下XXXView类的继承类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from rest_framework import generics
    class PublishView(generics.ListCreateAPIView):
        queryset = models.Publish.objects.all()
        serializer_class = serializer.PublishSerializers
     
     
    class PublishDetailView(generics.RetrieveUpdateDestroyAPIView):
        queryset = models.Publish.objects.all()
        serializer_class = serializer.PublishSerializers

      这样,代码就清晰很多了,但是,这种方法依然是将一个model表分成两个视图,那,有没有一种方法能将他们合并在一起呢?

    继承viewsets包下的ModelViewSet

    urls.py

    1
    2
    3
    4
    5
    6
    7
    url(r'^books/$', views.BookViewSet.as_view({"get":"list","post":"create"}),name="book_list"),
        url(r'^books/(?P<pk>d+)$', views.BookViewSet.as_view({
                    'get''retrieve',
                    'put''update',
                    'patch''partial_update',
                    'delete''destroy'
                }),name="book_detail"),

    views.py

    1
    2
    3
    4
    from rest_framework import viewsets
    class BookhViewSet(viewsets.ModelViewSet):
        queryset = models.Book.objects.all()
        serializer_class = serializer.PublishSerializers

      

  • 相关阅读:
    初探linux子系统集之led子系统(一)
    金融大数据分析从认知到实践(第1辑)(套装共3册)
    Blender权威指南
    零基础学Python
    中文版Photoshop CC图像处理与设计
    21天学通C++(第4版)
    Python应用开发实战
    电脑办公实战从入门到精通(超值版)
    Windows 10从新手到高手
    21天学通C语言(第7版)
  • 原文地址:https://www.cnblogs.com/xyhh/p/10860680.html
Copyright © 2020-2023  润新知