python-django rest framework框架之解析器
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框架之解析器的更多相关文章
- Django Rest framework 框架之解析器
解析器 序列化***** 请求数据进行校验 对queryset进行序列化处理 分页 路由 视图 渲染器
- 基于Django的Rest Framework框架的解析器
本文目录 一 解析器的作用 二 全局使用解析器 三 局部使用解析器 四 源码分析 回到目录 一 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理. 有appli ...
- Django Rest Framework(版本、解析器、序列化、数据验证)
一.版本 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. class UserView(APIView): def get(se ...
- Django REST framework基础:解析器和渲染器
解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentTy ...
- web前端Vue+Django rest framework 框架 生鲜电商项目实战✍✍✍
web前端Vue+Django rest framework 框架 生鲜电商项目实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频 ...
- Django REST framework框架介绍和基本使用
Django REST framework介绍 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官 ...
- Django Rest framework 框架之认证使用和源码执行流程
用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...
- Django Rest Framework框架 ---- url控制器
Django Rest Framework框架 ---- url控制器
- web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝
web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...
随机推荐
- P3041 [USACO12JAN]视频游戏的连击Video Game Combos
思路 简单的AC自动机上dp,暴力跳fail向子节点直接转移即可 代码 #include <cstdio> #include <algorithm> #include < ...
- 论文笔记: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 本文目标在于 ...
- Unity3D学习笔记(三十七):顶点偏移和溶解
顶点偏移 沿向量方向偏移,沿自身坐标系方向偏移 沿法线方向偏移,球体放大,立方体拆分 Shader "Lesson/VFVertOffsetVertex" { Properties ...
- ETCD网络层实现(待完成)
ETCD系列之三:网络层实现 ETCD系列之二:部署集群 ETCD系列之一:简介 ETCD相关介绍--整体概念及原理方面
- spring与mybatis四种整合方法
转载: 1.采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数. (1)Spring配置文件: <!-- 引 ...
- HDU 3526 Computer Assembling(最小割)
http://acm.hdu.edu.cn/showproblem.php?pid=3526 题意:有个屌丝要配置电脑,现在有n个配件需要购买,有两家公司出售这n个配件,还有m个条件是如果配件x和配件 ...
- 使用 jenkins 搭建CI/CD流水线 (MAC)
如何搭建持续集成/持续交付平台?? 如何使用jenkins搭建持续交付流水线,以及和其他工具(如artifactory)集成?如何使用元数据,记录软件发布过程的构建信息,测试结果,并用rest Api ...
- C#深入多线程
主线程: th = Thread.CurrentThread; //现在的线程为主线程 th.Name = "MainThread"; //set线程名字:主线程本身没有名字 th ...
- HTML基本内容
设置背景色:<body bgcolor="#AAAAAA">,设置背景图:<body background="1.png">. 颜色的知 ...
- _talent_req
学习天赋时,将产生消耗,当玩家已经学习过该天赋时,不产生消耗 comment 备注 spellId 天赋技能ID reqId 消耗模板ID,对应_req表中reqId