rest_framework的 数据解析器

首先需要知道前端发给后端的数据格式头有哪些:

  • media_type = 'application/json'
  • media_type = 'application/x-www-form-urlencoded'
  • media_type = 'multipart/form-data'
  • .......

以上几种请求信息中 rest_framework中已经内置了解析器,分别为:

from rest_framework.parsers import
JSONParser, # 解析第一种
FormParser, # 解析第二种(常见)
FileUploadParser # 解析文件上传 # 类中 视图的 配置 class DemoView(ApiView):
parser_classes = [JSONParser,FormParser]
# .... do you wna do return .....
# 全局配置
REST_FRAMEWORK = {
"DEFAULT_PARSER_CLASSES": ["rest_framework.parsers.JSONParser", "rest_framework.parsers.FormParser"],
}

接下来我们来看看源码:

  • 首先看看请求到来之前,解析器怎样加载的
 def initialize_request(self, request, *args, **kwargs):
"""
Returns the initial request object.
"""
parser_context = self.get_parser_context(request)
# self.get_authenticators() seteings配置的一个列表
# authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
return Request(
request, """看就是在这里加载的我们的解析器"""
parsers=self.get_parsers(), authenticators=self.get_authenticators(),
negotiator=self.get_content_negotiator(),
parser_context=parser_context
) def get_parsers(self): """
Instantiates and returns the list of parsers that this view can use.
"""
return [parser() for parser in self.parser_classes]
  • 那又是如何触发解析的呢?

    没错就是我们要拿数据的时候

当我们 调用 request.data 的时候 这时候触发执行,接下来我们看下他的源码

Request 类中的 data
@property
def data(self):
if not _hasattr(self, '_full_data'):
self._load_data_and_files()
return self._full_data # 调用 self._load_data_and_files() def _load_data_and_files(self):
"""
Parses the request content into `self.data`.
""" if not _hasattr(self, '_data'):
self._data, self._files = self._parse()
if self._files:
........ def _parse(self):
"""
Parse the request content, returning a two-tuple of (data, files) May raise an `UnsupportedMediaType`, or `ParseError` exception.
""" media_type = self.content_type ..........
"""
根据self.content_type 选择解析器 self.parsers =
初始化 request的时候
parsers=self.get_parsers(), """ parser = self.negotiator.select_parser(self, self.parsers) """选择对应的解析器 调用 parse 方法 解析"""
parsed = parser.parse(stream, media_type, self.parser_context) ### 选择解析器!!!
def select_parser(self, request, parsers):
"""
Given a list of parsers and a media type, return the appropriate
parser to handle the incoming request.
""" for parser in parsers:
if media_type_matches(parser.media_type, request.content_type):
"""找到解析器 """
return parser
return None

django rest_framework 框架的使用03的更多相关文章

  1. Python之Django rest_Framework框架源码分析

    #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_fram ...

  2. django rest_framework 框架的使用

    django 的中间件 csrf Require a present and correct csrfmiddlewaretoken for POST requests that have a CSR ...

  3. django rest_framework 框架的使用02

    rest_framework 访问频率的限制(节流) 对于用户访问频率的显示,rest_framework 也有自己的类进行约束 先来一个自己的基于它的类的节流类的限制 class VisitCont ...

  4. Django rest_framework 实用技巧

    前言: 最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用 ...

  5. Python之Django rest_Framework(2)

    实例化: v1 = ["view.xxx.path.Role","view.xxx.path.Group",] 可以循环,循环出来的每一个不能实例化 如果把v1 ...

  6. python之Django rest_framework总结

    一.rest api    a.api就是接口         如: - http://www.oldboyedu.com/get_user/                - http://www. ...

  7. rest_framework框架下的Django声明和生命周期

    rest_framework框架下的Django声明和生命周期 Django声明周期(request) 客户端发起请求 请求经过wsgi wsgi: 是一个协议----web服务网关接口,即在web服 ...

  8. Python之Django rest_Framework(3)

    补充:  为什么要前后端分离:       a.因为前端它有自己框架,这样它的效率就非常高       b.不做前后端分离,公司如果既有客户端,又有app这种情况下你就的写两遍 django rest ...

  9. rest_framework框架

    rest_framework框架的认识 它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架. 一  路由 可以通过路由as_view()传参 根据请求方式的不同执行对应不同的方法 ...

随机推荐

  1. 递归--练习2--noi6261汉诺塔

    递归--练习2--noi6261汉诺塔 一.心得 先把递推公式写出来,会很简单的 二.题目 6261:汉诺塔问题 总时间限制:  1000ms 内存限制:  65536kB 描述 约19世纪末,在欧州 ...

  2. 关于UDP很好的书籍和文章(整理、持续更新)

    文章 告知你不为人知的 UDP:疑难杂症和使用(必看)

  3. AtomicLong可以被原子地读取和写入的底层long值的操作

    java.util.concurrent.atomic.AtomicLong类提供了可以被原子地读取和写入的底层long值的操作,并且还包含高级原子操作. AtomicLong支持基础long类型变量 ...

  4. 雷林鹏分享:Ruby 面向对象

    Ruby 面向对象 Ruby 是纯面向对象的语言,Ruby 中的一切都是以对象的形式出现.Ruby 中的每个值都是一个对象,即使是最原始的东西:字符串.数字,甚至连 true 和 false 都是对象 ...

  5. Android Eclipse keystore.jks文件生成,根据keystore密钥获取SHA1安全码 ,apk打包

    keystore.jks文件生成,打包APK 选中项目右键-> Android Tools->Export Signed Application Package ,如图: 之后 点击Nex ...

  6. UVA-127 "Accordian" Patience (模拟)

    题目大意:一种纸牌游戏,将52张扑克牌排成一列,每次操作可将一张扑克牌移到它的前一张或前面第三张上当牌的点数或花色匹配时.每次都移动最靠左的扑克牌,并且能移动三格就移动三格.求最终扑克牌状态. 题目分 ...

  7. mysql基础运维

    1.创建用户并授权 一般新建数据库都需要新增一个用户,用于程序连接,这类用户只需要insert.update.delete.select权限. 新增一个用户,并授权如下: (1)grant selec ...

  8. hdu 3695 10 福州 现场 F - Computer Virus on Planet Pandora 暴力 ac自动机 难度:1

    F - Computer Virus on Planet Pandora Time Limit:2000MS     Memory Limit:128000KB     64bit IO Format ...

  9. Hadoop1.1.2伪分布式安装

    一.安装前准备设置Linux的静态IP修改VirtualBox的虚拟网卡地址修改主机名把hostname和ip绑定关闭防火墙:service iptables stop二.SSH免密码登陆生成秘钥文件 ...

  10. 中行用户购买KIS2014 68元/3年,时间:2013.10.18-2013.11.18

    活动地址:http://boc.kaba365.com/4989800.asp