rest_framework之解析器详解 05

解析器就是服务端写api,对于前端用户发来的数据进行解析。解析完之后拿到自己能用数据。

本质就是对请求体中的数据进行解析。

django的解析器

post请求过来之后,django 的request.body一定有值,request.post不一定有值。如果想让request.post有值,必须转为QueryDict类型的值。

1.urls.py

2.views.py

运行:

打印结果:

3.导入文件    解析器类

解析器类 源码流程

4.

post有值 要求1 请求头要求:

5.请求头要求:如果请求头中的 Content-Type: application/x-www-form-urlencoded,request.POST中才有值(去request.body中解析数据)。

post有值 要求2  数据格式要求:

name=xiaoming&age=18&gender=男

form表单、ajax请求:默认都是以上这种请求头和数据格式!

如果ajax请求设置请求头为json类型,那么post则没值。body里有值。

原生的django解析器:post有无值的情况

解析器
        前戏:django:request.POST/ request.body
            1. 请求头要求:
                Content-Type: application/x-www-form-urlencoded
                PS: 如果请求头中的 Content-Type: application/x-www-form-urlencoded,request.POST中才有值(去request.body中解析数据)。
            2. 数据格式要求:
                  name=xiaoming&age=18&gender=男
        
            如:
                a. form表单提交
                    <form method...>
                        input...
                        
                    </form>
                    
                b. ajax提交
                    $.ajax({
                        url:...
                        type:POST,
                        data:{name:xiaoming,age=18} # 内部转化 name=alex&age=18&gender=男
                    })
                    
                    情况一:
                        $.ajax({
                            url:...
                            type:POST,
                            headers:{'Content-Type':"application/json"}
                            data:{name:alex,age=18} # 内部转化 name=xiaoming&age=18&gender=男
                        })
                        # body有值;POST无
                    情况二:
                        $.ajax({
                            url:...
                            type:POST,
                            headers:{'Content-Type':"application/json"}
                            data:JSON.stringfy({name:xiaoming,age=18}) # {name:alex,age:18...}
                        })
                        # body有值;POST无
                        # json.loads(request.body)

rest_framework 解析器,对请求体数据进行解析

1.urls.py

2.JSONParser 解析器

from rest_framework.parsers import JSONParser

允许用户发送json数据     a. content-type: application/json     b. {name:"xiaoming",age:18}

views.py

post请求:发送 json数据

打印结果:自动解析,自己没有反序列化。

4.该请求头不支持。JSONParser 只支持 content-type: application/json

5.想要支持 这种请求头怎么办

FormParser:表示只能解析application/x-www-form-urlencoded头

views.py

源码:

运行:

打印结果:

请求进了的时候,什么时候调用解析器

request.data触发了解析器:解析流程

1.请求信息都在Request.data里

from rest_framework.request import Request

看源码:

2.data

3.解析

4.拿到所有解析器列表、用户请求头

5.循环解析器列表,取每一个解析器支持的请求头。根据解析器支持的请求头,返回到底应该用哪个解析器

6.选择解析器之后,则执行解析器的parse方法。

7.比如SONParser 解析器的解析方法。将请求数据解析出来。

请求流程

1.dispatch

2.

3.执行认证之前,先获取解析器。

4.列表生成器

5.全局配置

目前request 里面有 原生的request、解析器、认证的所有方法  3个东西

全局配置解析器

1.settings.py

如果某个视图仅仅文件上传,视图就需要单独设置解析器。局部配置解析器

# parser_classes = [JSONParser,FormParser,]

原文地址:https://www.cnblogs.com/aaronthon/p/9320912.html