zoukankan      html  css  js  c++  java
  • DRF解析器和序列化组件

    继续昨天的DRF解析器讲。

    昨天我们说到我们CourseView视图类继承了APIView,当我们发送post请求时,接受不同的格式编码的数据,通过request.data能够拿到不同编码格式的数据,我们来看一下他的源码是怎么走的。

    先说明DRF支持三种格式编码的解析,from rest_framework.parsers import JSONParser,FormParser,MultiPartParser

    点进去源码我们可以看到DRF中的解析器,默认支持三种:JSONParser,FormParser,MultiPartParser

    源码部分:

    当我们发送post请求时,request.data会在这一步进行解析数据。 所以关键的地方在.data部分。data是request的静态方法。所以我们找源码的时候应该找request中的静态方法data。我们都知道这个request是在APIView中的dispatch方法重新封装了。所以应该去APIVew中找dispatch方法,需要找到request怎么被重新封装的。

    点进源码:

     点进Resquest源码,找data静态方法:

    这一步就是数据解析的过程,点进去源码,

    点进源码:

     点进源码self.parser,

    这就又回到实例化request的时候了。

    点进去源码:

    这里这个self,一层一层往上找,就找到了这个self.指的是视图类函数。所以在试图类函数中,定义了哪些解析器,他就支持哪些解析器。

    那如果在我们的试图类函数中没有定义这个变量,那他是怎么走默认的解析器?

    那我们点进parser_classes源码:

    当我们点进api_settings中发现,api_settings是一个类的实例化对象,

    但是在这个类中并没有DEFAULT_PARSER_CLASSES方法。

    这里查一个知识点,在python基础中,一个类实例化后会进行初始化,执行__init__方法,但对于实例化没有的属性会走__getattr__方法。

    所以,没有DEFAULT_PARSER_CLASSES方法,会走__getattr__方法,

    而在我们的DEFAULTS中有DEFAULT_PARSER_CLASSES



    接下来:

    点进去settings,找REST_FRAMEWORK,找不到就去全局settings中找。找不到就去默认字典字典中找,如果还是找不到,就赋值为空字典。

     




    在最后的val就是   JSONParser,FormParser,MultiPartParser

    这就是DRF默认的那三种解析器。

     这就是解析器的源码。。。。。。

    2.序列化组件

    用序列化组件去写接口。

    我们访问CourseView视图的时候,get请求使用我们自己写的json数据的方式,比较麻烦。

    现在我们换一种方法,

    我们先来说一种响应方式,这是rest_framework提供的响应方式

    from rest_framework.response import Response   在return的时候,就不用写HttpResponse,写成return Response()。
    使用这种相应方式,要在setting中注册app ,'rest_framework',然后用浏览器的方式请求。

    然后我们来说第二种方式发送get请求:
    class CourseView(APIView):
        def get(self,request):
            #查看所有数据
            #方式一
            course_list = Course.objects.all()
            # ret = []
            # for course in course_list:
            #     ret.append({
            #         "title":course.title,
            #         "desc":course.desc,
            #     })
            # return HttpResponse(json.dumps(ret,ensure_ascii=False))
            # 方式二
            from django.core.serializers import serialize    #django的序列化组件
            data = serialize('json',course_list)
            return Response(data)
    
    

    这就是第二种方法,很简单,但是我们依然不用他,关键在于他只是一个序列化组件,而我们的restframework不管可以做序列化,它还可以做校验的功能,保存记录的功能。

    然后我们说第三种方式,restframework序列化组件

    这就是get请求接口。

    接下来我们来写post接口。

    我们另外举个例子:

    先多建几张表。BOOK表 , PUBLISH表  ,Author表,

    如果想显示出版社的邮箱和出版社名字该怎么做呢?

    对于多对多的字段就不能这样写了:

    然后是post请求

     

    类比于form,form有一个modelform,他不用我们写form的那些复杂的字段,同样的serializer也有modelserializer,他也不用我们写那些复杂的字段。

    所以我们把那个序列化类写成modelserializer,其他的东西都不用改。

    这样post和get请求的接口就做完了






    restful使用不同的请求方式去做url的分支
                            GET              
                    books-------->查看数据--------------------> 返回所有数据列表 :[{},{},{}]
                            POST
                    books-------->添加数据--------------------->返回添加数据 :{}
                            PUT
                    books/1------->更新pk=1的数据--------------->返回更新后的数据: {}
                            Delete
                    books/1-------> 删除pk=1的数据-------------->返回空
                            GET
                    books/1------->查看单条数据   --------------->返回查看的单条数据 {}




  • 相关阅读:
    ld: library not found for -lstdc++.6
    WebViewJavascriptBridge 进行js 与native通信。
    invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
    OC 与 js 界面JSBridge交互
    react-native init的时候出现问题:npm WARN React-native@0.35.0 requires a peer of react@~15.3.1 but none was
    react-无状态组件
    2018年末--积极拥抱h5.转载 大前端时代来临,我们何去何从?
    /Users/macbook/Library/Developer/Xcode/DerivedData/MapViewDemo: No such file or direc
    EXCEL中如何获得工作表(sheet)的名称
    DELPHI中Showmodal与Show的区别
  • 原文地址:https://www.cnblogs.com/yb635238477/p/9669437.html
Copyright © 2011-2022 走看看