美文网首页大数据 爬虫Python AI Sql
django rest framework------得心应手

django rest framework------得心应手

作者: 2a53ffc328de | 来源:发表于2018-09-07 22:11 被阅读2次

    Warninig:本文仅适用小白,老手请绕道

    总共,分三步

    对于一个从未接触的新事物来说,我偏向于先看看他的外表,再一层一层扒掉它的外衣。

    所以,这次,我们自顶向下的来看django rest framework是如何实现restful api的。

    在django rest framework下提供restful api 总共分三步:

    首先在viwe.py文件实现GoodsListViewSet如下:

    from rest_framework import mixins

    from rest_frameworkimport viewsets

    class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):

        queryset = Goods.objects.all()# 获取待返回数据的

        querysetserializer_class = GoodsSerializer# 指定序列化器

    接着,在serilaizers.py文件中实现GoodsSerializer如下:

    from rest_framework import serializers

    from goods.models import Goods

    class GoodsSerializer(serializers.ModelSerializer):   

        class Meta:

            model = Goods 

            fields ='__all__'

    最后,在url.py文件中配置路由信息如下:

    from rest_framework.documentation import include_docs_urls

    from rest_framework.routers import DefaultRouter

    router = DefaultRouter()

    router.register(r'goods', GoodsListViewSet, base_name="goods")

    urlpatterns = [

        url(r'^', include(router.urls))

    ]

    好了。

    现在已经可以通过浏览器中输入域名/goods 来获取goods的所有数据了,以json格式展现。

    django rest framework还为我们处理了json数据,以便更好的展示

    然后呢?只是这样吗?

    到底强大在哪里呢?

    我也不知道,我觉得吧,这得结合具体的业务才能评判。

    所以今天,我们来看下django rest framework到底是怎么实现restful api的

    难道你们不好奇吗。

    还得从mixins.ListModelMixin和viewsets.GenericViewSet讲起


    通过各种类的层层继承,django rest framework为我们做了很多事。

    导致我们只需要继承相应的类以及适当的重载某些特性,即可实现所需的功能

    我们看到,在view.py文件中,GoodsListViewSet类本身并没有指定任何方法来响应http请求

    但是他继承了两个类。

    我们先进入viewsets.GenericViewSet的定义看看:

    class GenericViewSet(ViewSetMixin, generics.GenericAPIView):

        """    The GenericViewSet class does not provide any actions by default,

        but does include the base set of generic view behavior, such as

        the `get_object` and `get_queryset` methods.

        """pass

    啥也没有,只是继承了另外两个类............

    于是我们再来看下ViewSetMixin的定义:

    class ViewSetMixin(object):

        """    This is the magic.

        Overrides `.as_view()` so that it takes an `actions` keyword that performs

        the binding of HTTP methods to actions on the Resource.

        For example, to create a concrete view binding the 'GET' and 'POST' methods

        to the 'list' and 'create' actions...

        view = MyViewSet.as_view({'get': 'list', 'post': 'create'})

        """    ............

    代码有很多,我一行也没考,但是从这个说明中以及可以看出一些东西了,下面,我用我CET6的水平为大家翻译一下。

    这是一个魔法(这么自恋?!)。

    我们重写了as_view(),实现了http请求到对资源的各种操作的绑定。

    举个栗子,我们将http的get,post请求分别绑定到了list,creat上去......

    emmmmm,貌似有点明白了.......

    但是list,creat方法又是在哪里实现的呢?

    没错,正是mixins.ListModelMixin

    class ListModelMixin(object):

        """    List a queryset.

        """deflist(self, request, *args, **kwargs):

            queryset = self.filter_queryset(self.get_queryset())

            page = self.paginate_queryset(queryset)

            ifpageisnot None:

                serializer = self.get_serializer(page, many=True)

                return self.get_paginated_response(serializer.data)

            serializer = self.get_serializer(queryset, many=True)

            returnResponse(serializer.data)

    mixins.ListModelMixin实现了list操作,那么creat呢?

    没错,是mixins.CreateModelMixin,实际上mixins.xxxxModelMixin共有5个,分别对应了不同的操作,需要时只要在类定义中继承即可。

    至此,逻辑已经很清楚了。

    我再来看看那个不起眼的generics.GenericAPIView到底干了啥:

    class GenericAPIView(views.APIView):

        """    Base class for all other generic views.

        """# You'll need to either set these attributes,# or override `get_queryset()`/`get_serializer_class()`.# If you are overriding a view method, it is important that you call# `get_queryset()` instead of accessing the `queryset` property directly,# as `queryset` will get evaluated only once, and those results are cached# for all subsequent requests.queryset = None

        serializer_class = None

    同样,我们只看说明。

    他让我们重置queryset 和serializer_class这两个attributes,或者重载get_queryset()和get_serializer_class()这两个方法

    从名字中看的出来,是和序列化相关的。

    所以我们明白了,GoodsListViewSet继承了两个类,一个指定了http请求的响应方法,一个指定了数据的序列化方法。

    我们来看个结构图:

    完美~

    相关文章

      网友评论

        本文标题:django rest framework------得心应手

        本文链接:https://www.haomeiwen.com/subject/hkphgftx.html