1.解析器 : 对请求的数据进行解析 - 请求体进行解析。 解析器在你不拿请求体数据时 不会调用。

class UsersView(APIView):
def get(self,request,*args,**kwargs): return Response('...') def post(self,request,*args,**kwargs):
# # application/json
# print(request._request.body) # b"xxxxx" decode() json.loads
# print(request._request.POST) # 无
# 当post 请求的数据格式是application/json的时候, request._request.body有值,而request._request.POST并没有值
# 我们要通过 decode + json.loads 来获取数据 # # www-form-url-encode
# print(request._request.body)
# print(request._request.POST)
# 当post 请求的数据格式是www-form-url-encode的时候,request._request.body和request._request.POST都有值 # 而在我们用rest framework时往往发送的都是json格式的数据,那我们每次都要这么费事的转化吗,答案肯定不是
# 可以设置 parser_classes from rest_framework.parsers import JSONParser,FormParser
class UsersView(APIView):
parser_classes = [JSONParser,FormParser] #表示服务端可以解析的数据格式的种类。
            #如果客户端的Content-Type的值和 application/json 匹配:JSONParser处理数据
            #如果客户端的Content-Type的值和 application/x-www-form-urlencoded 匹配:FormParser处理数据
def get(self,request,*args,**kwargs):
return Response('...') def post(self,request,*args,**kwargs):
# request.data 就是 处理转化后的数据 {'name':'xxx','age':'12'}
print(request.data)
          print(request.FILES)
          print(request.POST)
          return Response('...')

      # 全局使用: 配置文件  一般都默认使用全局配置
        REST_FRAMEWORK = {
           'DEFAULT_PARSER_CLASSES':[
            'rest_framework.parsers.JSONParser',
            'rest_framework.parsers.FormParser',
           ]
        }
       

2.  print(request.data) 的 源码

class Request(object):
@property
def data(self):
if not _hasattr(self, '_full_data'):
       #调用_load_data_and_files方法
self._load_data_and_files()
return self._full_data def _load_data_and_files(self):
if not _hasattr(self, '_data'):
       #调用_parse方法
self._data, self._files = self._parse() def _parse(self):
     #调用DefaultContentNegotiation类的select_parser方法,见下面
parser = self.negotiator.select_parser(self, self.parsers) # 在封装Request的时候self.parser = 配置的解析类的对象列表
#self.negotiator = self._default_negotiator() = api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS() if not parser:
#如果返回 None 说明不匹配,抛出异常
raise exceptions.UnsupportedMediaType(media_type) try:
# 匹配成功, 相应的解析类对象调用parse方法
parsed = parser.parse(stream, media_type, self.parser_context) class DefaultContentNegotiation(BaseContentNegotiation):
def select_parser(self, request, parsers):
for parser in parsers:
# 判断 解析类的对象和 请求的 content_type 是否匹配
if media_type_matches(parser.media_type, request.content_type):
return parser
return None 拿 JSONParser 举例
class JSONParser(BaseParser): media_type = 'application/json'
renderer_class = renderers.JSONRenderer
strict = api_settings.STRICT_JSON def parse(self, stream, media_type=None, parser_context=None):
try: #和我们自己处理是一个原理
# 先decode
decoded_stream = codecs.getreader(encoding)(stream)
parse_constant = json.strict_constant if self.strict else None
# 再load
return json.load(decoded_stream, parse_constant=parse_constant)
except ValueError as exc:
raise ParseError('JSON parse error - %s' % six.text_type(exc))

python-django rest framework框架之解析器的更多相关文章

  1. Django Rest framework 框架之解析器

    解析器 序列化***** 请求数据进行校验 对queryset进行序列化处理 分页 路由 视图 渲染器

  2. 基于Django的Rest Framework框架的解析器

    本文目录 一 解析器的作用 二 全局使用解析器 三 局部使用解析器 四 源码分析 回到目录 一 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理. 有appli ...

  3. Django Rest Framework(版本、解析器、序列化、数据验证)

    一.版本 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. class UserView(APIView): def get(se ...

  4. Django REST framework基础:解析器和渲染器

    解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentTy ...

  5. web前端Vue+Django rest framework 框架 生鲜电商项目实战✍✍✍

    web前端Vue+Django rest framework 框架 生鲜电商项目实战  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频 ...

  6. Django REST framework框架介绍和基本使用

    Django REST framework介绍 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官 ...

  7. Django Rest framework 框架之认证使用和源码执行流程

    用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...

  8. Django Rest Framework框架 ---- url控制器

    Django Rest Framework框架 ---- url控制器

  9. web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝

    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...

随机推荐

  1. P3041 [USACO12JAN]视频游戏的连击Video Game Combos

    思路 简单的AC自动机上dp,暴力跳fail向子节点直接转移即可 代码 #include <cstdio> #include <algorithm> #include < ...

  2. 论文笔记:Parallel Tracking and Verifying: A Framework for Real-Time and High Accuracy Visual Tracking

    Parallel Tracking and Verifying: A Framework for Real-Time and High Accuracy Visual Tracking  本文目标在于 ...

  3. Unity3D学习笔记(三十七):顶点偏移和溶解

    顶点偏移 沿向量方向偏移,沿自身坐标系方向偏移 沿法线方向偏移,球体放大,立方体拆分 Shader "Lesson/VFVertOffsetVertex" { Properties ...

  4. ETCD网络层实现(待完成)

    ETCD系列之三:网络层实现 ETCD系列之二:部署集群 ETCD系列之一:简介 ETCD相关介绍--整体概念及原理方面

  5. spring与mybatis四种整合方法

    转载: 1.采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数.   (1)Spring配置文件: <!-- 引 ...

  6. HDU 3526 Computer Assembling(最小割)

    http://acm.hdu.edu.cn/showproblem.php?pid=3526 题意:有个屌丝要配置电脑,现在有n个配件需要购买,有两家公司出售这n个配件,还有m个条件是如果配件x和配件 ...

  7. 使用 jenkins 搭建CI/CD流水线 (MAC)

    如何搭建持续集成/持续交付平台?? 如何使用jenkins搭建持续交付流水线,以及和其他工具(如artifactory)集成?如何使用元数据,记录软件发布过程的构建信息,测试结果,并用rest Api ...

  8. C#深入多线程

    主线程: th = Thread.CurrentThread; //现在的线程为主线程 th.Name = "MainThread"; //set线程名字:主线程本身没有名字 th ...

  9. HTML基本内容

    设置背景色:<body bgcolor="#AAAAAA">,设置背景图:<body background="1.png">. 颜色的知 ...

  10. _talent_req

    学习天赋时,将产生消耗,当玩家已经学习过该天赋时,不产生消耗 comment 备注 spellId 天赋技能ID reqId 消耗模板ID,对应_req表中reqId