rest_framework之解析器详解 05

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

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

django的解析器

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

1.urls.py

rest_framework之解析器详解 05_第1张图片

2.views.py

rest_framework之解析器详解 05_第2张图片

运行:

rest_framework之解析器详解 05_第3张图片

打印结果:

rest_framework之解析器详解 05_第4张图片

3.导入文件    解析器类

rest_framework之解析器详解 05_第5张图片

解析器类 源码流程

4.

rest_framework之解析器详解 05_第6张图片

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

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

rest_framework之解析器详解 05_第7张图片

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表单提交
                    
input...
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

rest_framework之解析器详解 05_第8张图片

2.JSONParser 解析器

from rest_framework.parsers import JSONParser

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

rest_framework之解析器详解 05_第9张图片

views.py

rest_framework之解析器详解 05_第10张图片

post请求:发送 json数据

rest_framework之解析器详解 05_第11张图片

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

rest_framework之解析器详解 05_第12张图片

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

rest_framework之解析器详解 05_第13张图片

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

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

views.py

rest_framework之解析器详解 05_第14张图片

源码:

rest_framework之解析器详解 05_第15张图片

运行:

rest_framework之解析器详解 05_第16张图片

打印结果:

rest_framework之解析器详解 05_第17张图片

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

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

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

from rest_framework.request import Request

看源码:

2.data

rest_framework之解析器详解 05_第18张图片

3.解析

rest_framework之解析器详解 05_第19张图片

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

rest_framework之解析器详解 05_第20张图片

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

rest_framework之解析器详解 05_第21张图片

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

rest_framework之解析器详解 05_第22张图片

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

rest_framework之解析器详解 05_第23张图片

请求流程

1.dispatch

rest_framework之解析器详解 05_第24张图片

2.rest_framework之解析器详解 05_第25张图片

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

rest_framework之解析器详解 05_第26张图片

4.列表生成器

rest_framework之解析器详解 05_第27张图片

5.全局配置

rest_framework之解析器详解 05_第28张图片

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

全局配置解析器

1.settings.py

rest_framework之解析器详解 05_第29张图片

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

# parser_classes = [JSONParser,FormParser,]

rest_framework之解析器详解 05_第30张图片

 

你可能感兴趣的:(rest_framework之解析器详解 05)