Django解析器
1.什么是解析器?
对请求的数据进行解析-请求体进行解析。解析器在你不拿请求体数据时,不会被调用。
安装与使用:(官方文档)
https://www.django-rest-framework.org/
pip install djangorestframework
from rest_framewirk.views import APIView
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))
Django解析器的更多相关文章
- drf8 解析器
解析器的介绍 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己想要的数据类型的过程. 本质就是对请求体中的数据进行解析. Accept与ContentType请求头. Accept是告诉 ...
- rest_framework之解析器详解 05
解析器就是服务端写api,对于前端用户发来的数据进行解析.解析完之后拿到自己能用数据. 本质就是对请求体中的数据进行解析. django的解析器 post请求过来之后,django 的request. ...
- Django rest framework(5)----解析器
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- Django REST framework基础:解析器和渲染器
解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentTy ...
- Django Rest Framework之解析器
基本代码结构 urls.py: from django.conf.urls import url, include from web.views.s5_parser import TestView u ...
- Django Rest framework 之 解析器
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django Rest Framework源码剖析(五)-----解析器
一.简介 解析器顾名思义就是对请求体进行解析.为什么要有解析器?原因很简单,当后台和前端进行交互的时候数据类型不一定都是表单数据或者json,当然也有其他类型的数据格式,比如xml,所以需要解析这类数 ...
- Django Rest Framework(版本、解析器、序列化、数据验证)
一.版本 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. class UserView(APIView): def get(se ...
- django的rest framework框架——版本、解析器、序列化
一.rest framework的版本使用 1.版本可以写在URL中,通过GET传参,如 http://127.0.0.1:8082/api/users/?version=v1 (1)自定义类获取版本 ...
随机推荐
- java 多线程 面试
1.多线程有什么用? (1)发挥多核CPU的优势: 当前,应用服务器至少也都是双核的,4核.8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75 ...
- C# 与 .NET Framework 对应关系
C#各版本新增加功能(系列文章) 本系列文章主要整理并介绍 C# 各版本的新增功能. C# 8.0 C#8.0 于 2019年4月 随 .NET Framework 4.8 与 Visual St ...
- com.alibaba.fastjson使用介绍
首先,介绍一下fastjson.fastjson是由alibaba开源的一套json处理器.与其他json处理器(如Gson,Jackson等)和其他的Java对象序列化反序列化方式相比,有比较明显的 ...
- python实践项目七:正则表达式版本的strip()函数
描述:写一个函数,它接受一个字符串,做的事情和 strip()字符串方法一样.如果只传入了要去除的字符串, 没有其他参数, 那么就从该字符串首尾去除空白字符:否则, 函数第二个参数指定的字符将从该字符 ...
- 酷!微软发布新终端工具,Win 10 将自带 Linux 内核
原创:技术最前线(id:TopITNews) 北京时间 5 月 7 日,2019 年微软 Build 开发者大会在雷德蒙德召开.今年大会上亮点很多,本文汇总一些和开发者相关的内容. 1. Window ...
- spring session cpu占用过高
集成spring session很简单,只需几行代码即可. @Configuration @EnableRedisHttpSession public class SessionConfig { ...
- nginx配置比较杂乱的总结
常用变量 demo uri www.example.com/mock/interface?param1=203¶m2=test $args uri中的参数值 ?后面的部分 param1 ...
- GIT讲解
一.什么是Git: Git是目前世界上最先进的分布式版本控制系统. 二.为什么要用版本控制系统: 1.更方便的存储版本 2.恢复之前的版本 3.更方便的进行对比 4.协同合作 三.如何安装GIT: 1 ...
- RequestBody只能读取一次的问题
一.为什么只能读一次 原因很简单:因为是流.想想看,java中的流也是只能读一次,因为读完之后,position就到末尾了. 二.解决办法 思路:第一次读的时候,把流数据暂存起来.后面需要的时候,直接 ...
- Oracle 11g安装过程工作Oracle数据库安装图解
一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 官方下地址: oracle.com/tec ...