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,]

  • 相关阅读:
    iphone开发 使用TouchJSON框架 解析JSON
    iphone开发UIScrollView控件详解
    iPhone UIAlertView属性及使用方法
    vim文本编辑器使用大全 命令的解读
    iphone开发软件Xcode3.2.6破解免证书真机开发调试方案
    Objectivec语言 字符串类NSMutableString用法
    iphone开发 如何在NSMutableDictionary中放入基本数据类型
    找了很久,终于让我找到了,登陆界面登陆按钮随着输入法键盘的弹出而动态改变
    微软安全指南中心:Windows 2000
    在网络中安装、配置和使用SUS服务
  • 原文地址:https://www.cnblogs.com/aaronthon/p/9320912.html
Copyright © 2011-2022 走看看