DRF:源码剖析 - 解析器组件

简介

 解析器顾名思义就是对请求体进行解析。为什么要有解析器?原因很简单,当后台和前端进行交互的时候数据类型不一定都是表单数据或者json,当然也有其他类型的数据格式,比如xml,所以需要解析这类数据格式就需要用到解析器(也可以将请求体拿到,然后利用其他模块进行解析)。

基本使用

解析器是基于APIView,该类中的dispatch()方法中,对request做了操作,从请求头中,解析出数据,放入了request.data 中

1、json解析器

 # views.py  

  以登录为例,发送post请求

from rest_framework.views import APIView
from rest_framework.parsers import FormParser, JSONParser

class LoginView(APIView):
    parser_classes = [FormParser, JSONParser]     #在视图函数中配置解析器,一个视图函数可以配置多个
def get(self, request):
        return render(request, 'login.html')

    def post(self, request):
        ret = request.data    #利用APIView中解析器,可以解析,浏览器发送的json数据,存储在request.data中
     print(ret) #{'name': 'chen', 'age': '22'} 接收到的数据仍然是 json数据
return HttpResponse("Ok")

 

 以 postman 工具模仿浏览器,发送post请求,发送json数据,查看返回的结果:

  (1)发送请求

              

   

  (2)后台结果,

     仍然是接受的 json 数据,只不过解析之后,放入到了 request.data

               

2、form 解析器

   同样以登录为例,视图函数同 json 解析器中一样

  (1)postman 发送表单数据 post请求  urlencode数据

                   

  (2)后台接收到数据

      为 querydict 类型的数据

                    

源码剖析

1、根据以上示例,梳理解析器解析数据流程

  • 获取用户请求
  • 获取用户请求体
  • 根据用户请求头信息和parase_classes=[...],中的请求头进行比较,匹配上请求头就使用该解析器处理
  • 解析器从请求体中拿数据进行处理,处理完成之后将结果返回给request.data

2、

 

 

 

源码分析的相关知识点

 

 

 

总结

1.解析器本质:

  django rest framework解析本质是根据请求头中的Content-Type来实现,不同的类型使用不同的解析器,一个视图可有多个解析器。

2.使用:

#全局使用   在settings中设置
REST_FRAMEWORK = {
   
    #解析器
    "DEFAULT_PARSER_CLASSES":["rest_framework.parsers.JSONParser","rest_framework.parsers.FormParser"]
}

#单一视图使用 在视图函数中设置 parser_classes = [JSONParser,FormParser]

 

posted @ 2018-12-06 20:17  葡萄想柠檬  Views(114)  Comments(0Edit  收藏  举报
目录代码