解析器

解析器的作用

解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据。本质就是对请求体中的数据进行解析。

在了解解析器之前,我们要先知道Accept以及ContentType请求头。

Accept : 是告诉对方我能解析什么样的数据,通常也可以表示我想要什么样的数据。

ContentType : 是告诉对方我给你的是什么样的数据类型。

解析器工作原理的就是拿到请求的ContentType来判断前端给我的数据类型是什么,然后我们在后端使用相应的解析器去解析数据。

Django中的数据解析

在视图中我们可以通过request.POST来获取前端发来的请求数据,那么Django框架是如何拿到请求体中的数据的呢?我们一起来看一下:

首先,request对象是 WSGIRequest 类的实例化对象,那我们去看一下代码:

from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser

# reset_framawork 默认路由

from django.contrib import admin
from django.urls import path,re_path
from app01 import views
from rest_framework import routers
from django.conf.urls import url,include routers = routers.DefaultRouter()
routers.register("authors", views.AuthorModelView) urlpatterns = [
re_path(r'^',include(routers.urls)), # re_path(r'^admin/', admin.site.urls),
# re_path(r'^publishes/$', views.PublishView.as_view(),name="publish"), # View:view(request)=====APIView:dispatch()
# re_path(r'^publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(),name="detailpublish"), # View:view(request)=====APIView:dispatch()
#
# re_path(r'^books/$', views.BookView.as_view(),name="books"),
# re_path(r'^books/(\d+)/$', views.BookDetailView.as_view(),name="detailbook"),
#url(r'^books/(\d+)/$', View:view), # view(request) # re_path(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
# re_path(r'^authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor"), re_path(r'^login/$', views.LoginView.as_view(),name="login"), ]

此时我们回想在Django的视图中通过request.POST和request.FILES能够取到数据都是因为在这里把请求的数据解析,并赋值给request对象了。

同时我们还会发现一个问题就是,Django的解析器是不支持 ContenType为 application/json 的,也就是说无法解析json格式的数据

DRF中的解析器

我们都知道在DRF中获取请求提交的数据是通过访问request.data,那么request.data的数据是从哪里来的呢?我们通过源码来看一下:

如果没有配置解析器,DRF会使用默认的解析器:

我们可以在单个视图或者全局的settings.py中配置要使用的解析器。

from rest_framework.response import Response

单个视图配置

class BookViewSet(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = BookModelSerializer
parser_classes = [JSONParser, ]

全局配置

REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
)
}

注意:当你的项目中只配置了 JSONParser 解析器时,你的项目现在就只能解析JSON格式的数据了,客户端如果使用浏览器提交,那么你将无法解析。

注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项

渲染器(rander)

渲染器同解析器相反,它定义了框架按照content_type来返回不同的响应。

DRF提供的渲染器有很多,默认是

 'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),

我们也可以在视图中局部设置也可以在全局的settings.py中进行设置:

局部设置

own:

from rest_framework.views import APIView
from rest_framework.response import Response
from django.shortcuts import HttpResponse
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer """
最常用:
JSONRenderer : 按照json格式数据返回。
BrowsableAPIRenderer :rest_framwork提供友好页面渲染(不加就是单调的页面) """ class CourseView(APIView):
renderer_classes = [JSONRenderer, BrowsableAPIRenderer] def get(self, request, *args, **kwargs):
return Response('1111111111')

class PublisherViewSet(ModelViewSet):
queryset = models.Publisher.objects.all()
serializer_class = PublisherModelSerializer
renderer_classes = [JSONRenderer, ]

这样设置后就只能返回JSON格式的数据了,并不会像之前一样提供一个阅读友好的web页面。

全局设置

REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
),
}

注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项。

 Django REST framework解析器和渲染器的更多相关文章

  1. Django REST framework - 解析器和渲染器

    目录 Django REST framework - 解析器和渲染器 解析器 Django中的数据解析 DRF中的解析器 渲染器 Django REST framework - 解析器和渲染器 解析器 ...

  2. Restful API学习Day5 - DRF之限制 分页 解析器和渲染器

    参考文档: Django REST framework基础:认证.权限.限制 Django REST framework基础:分页 Django REST framework基础:解析器和渲染器 一. ...

  3. Django-Rest-Framework的解析器和渲染器

    Django-Rest-Framework的解析器和渲染器  restful framework 解析器 解析器的作用就是服务端接收客户端传来的数据,把数据解析成自己想要的数据类型的过程 本质就是对请 ...

  4. DRF 版本、认证、权限、限制、解析器和渲染器

    目录 一.DRF之版本控制 为什么要有版本控制? DRF提供的版本控制方案 版本的使用 全局配置 局部配置(使用较少) 二.DRF之认证 内置的认证 步骤 三.DRF之权限 1.自定义一个权限类 2. ...

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

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

  6. Django REST framework的解析器与渲染器

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

  7. 07 Django REST Framework 解析器与渲染器

    01-解析器 REST 框架包括一些内置的Parser类,允许你接受各种媒体类型的请求.还支持定义自己的自定义解析器,这使你可以灵活地设计API接受的媒体类型. 注意: 开发客户端应用程序时应该始终记 ...

  8. rest framework 解析器,渲染器

    解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 请求体相关字段: Accept:指定了接收的数据类型 Conte ...

  9. DRF 解析器和渲染器

    一,DRF 解析器 根据请求头 content-type 选择对应的解析器就请求体内容进行处理. 1. 仅处理请求头content-type为application/json的请求体 from dja ...

随机推荐

  1. 多生产者多消费者(第二种方式2.1)基于BlockingQueue

    public class Producer implements Runnable { //静态变量只初始化一次 private static AtomicInteger count = new At ...

  2. 百度小程序上传失败 ServerError:30010的原因

    最近通过uniapp编译百度智能小程序后上传遇到了报错,错误码为30010. 原因很简单开发者工具和版本库产生了冲突. 两个解决方案,升级开发者工具,降低发布时的版本库 exit;

  3. COGS 有标号的DAG/强连通图计数

    COGS索引 一堆神仙容斥+多项式-- 有标号的DAG计数 I 考虑\(O(n^2)\)做法:设\(f_i\)表示总共有\(i\)个点的DAG数量,转移考虑枚举DAG上所有出度为\(0\)的点,剩下的 ...

  4. Unity性能优化-音频设置

    没想到Unity的音频会成为内存杀手,在实际的商业项目中,音频的优化必不可少. 1. Unity支持许多不同的音频格式,但最终它将它们全部转换为首选格式.音频压缩格式有PCM.ADPCM.Vorbis ...

  5. Java身份证处理工具

    身份证处理工具 /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> * & ...

  6. .net core使用ocelot---第八篇 Consul

    简介 .net core使用ocelot---第一篇 简单使用   .net core使用ocelot---第二篇 身份验证使用  .net core使用ocelot---第三篇 日志记录  .net ...

  7. IOS - 总结下swift使用GCD 多线程(二)GCD和DispatchQueue

    1.前言  iOS中处理多核并发的技术有两种分别是:`Grand Central Dispatch`(以下简称`GCD`)和`NSOperationQueue`框架.iOS开发的老司机们在程序开发中处 ...

  8. 纯 CSS 画 iphone

    好几天没有更新了,直接上效果吧,哈哈!(我想这个应该大部分都会!哈哈哈!) 代码如下: html: <div class="container"> <div cl ...

  9. CSS 实现盒子水平居中、垂直居中和水平垂直居中的方法

     CSS 实现盒子模型水平居中 水平居中效果图如下: HTML: CSS 全局样式: 方法一:使用margin: 0 auto;(只适用于子盒子有宽的时候) 方法二:text-align + disp ...

  10. 一张图弄懂js原型和原型链

    前言 JavaScript的原型和原型链是面试的时候经常被问及到的问题,考察了我们对JavaScript的基础掌握情况,今天我们在这里用一张图来梳理下其中的知识点. 下面我来引入这张非常经典的图,我也 ...