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. [JavaScript] - replaceAll,将字符串中的字母或数字等全部替换掉的方式

    原题 function DNAtoRNA(dna) { // create a function which returns an RNA sequence from the given DNA se ...

  2. Kubernetes之总体了解

    Kubernetes:架构.基本概念.用于总体了解 Kubernetes系列之介绍篇:优势.用途 Kubernetes核心概念总结

  3. cas4.2.4 登添加验证码

    看了很多添加验证码的博文,唯独没有4.24的 重点看第3条,其余的和别人博文大致相同 1.首先在cas工程的web.xml增加验证码功能的支持 <!-- 验证码功能 -->      &l ...

  4. 解决:springmvc中接收date数据问题

    这里提供三种解决方案. 一.局部转换 :只是对当前Controller类有效 springMVC.xml中添加: <bean class="org.springframework.we ...

  5. git切换分支报错:error: pathspec 'origin/XXX' did not match any file(s) known to git

    项目上有一个分支test,使用git branch -a看不到该远程分支,直接使用命令git checkout test报错如下: error: pathspec 'origin/test' did ...

  6. c#四舍五入取整

    Math.Round(3.45, 0, MidpointRounding.AwayFromZero) 上取整或下取整 Math.Ceiling(3.1)=4; Math.Floor(3.9)=3;

  7. mutect/mutsig/gistic官网汇总

    http://software.broadinstitute.org/software/cprg/

  8. python 下载地址

    https://www.python.org/ftp/python/

  9. python 操作记事本

    需事先打开记事本,再运行下面脚本 # encoding: utf- import win32api import win32gui import win32con print("Hello, ...

  10. fit_transform和transform的区别

    来自:泡泡糖nana 来自:俞驰 1. fit_transform是fit和transform的组合. 2. fit(x,y)传两个参数的是有监督学习的算法,fit(x)传一个参数的是无监督学习的算法 ...