zoukankan      html  css  js  c++  java
  • 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,]

  • 相关阅读:
    C#类型转换
    C#面向对象之多态
    C#面向对象之继承
    C#各种字段类型对比
    C#关键字:static
    C#面向对象之封装
    C#关键字:访问修饰符
    C#类型成员:构造函数
    C#类型成员:方法
    C#类类型
  • 原文地址:https://www.cnblogs.com/aaronthon/p/9320912.html
Copyright © 2011-2022 走看看