什么是渲染器
    渲染器就是将服务器生成的数据格式转为http请求的格式
 
渲染器触发及参数配置
在DRF配置参数中,可用的渲染器作为一个类的列表进行定义
但与解析器不同的是,渲染器的列表是有顺序关系的
REST框架将对传入请求执行内容协商,根据请求的类型确定最合适的渲染器以满足类型要求
内容协商过程会检查请求头部的 Accept 属性,以确定客户期望的媒体类型。
URL上的格式后缀可用于显式地请求特定的内容类型
 
# DEFAULT_RENDERER_CLASSES 设置全局渲染器集合
# Django默认的渲染器
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
)
}
局部指定渲染器
单独指定的优先级高于全局的解析器配置,单独指定什么,就只能用什么渲染器
 
# 类属性指定
class TestApi(APIView):
# 通过renderer_classes指定该视图的渲染器,值是一个元组or list
renderer_classes = (JSONRenderer,)
def post(self, request):
return Response('xxx')
 
#函数装饰器指定
from rest_framework.decorators import parser_classes
@api_view(['POST'])
@renderer_classes((JSONRenderer,))
def testApi(request):
...
 
渲染器类的顺序
指定渲染器类时,要考虑清楚为每种媒体类型分配什么样的优先级
如果客户端未明确指定它可以接受的内容类型,例如发送 Accept: */* 属性值,或者根本没有Accept 属性值
那么REST框架将选择settings列表中的第一个渲染器用于渲染响应内容
如果包含可根据请求的不同,同时提供常规网页和API响应的视图,可以使用TemplateHTMLRenderer 作为默认渲染器
渲染器区别
JSONRenderer
使用utf-8编码将响应内容渲染为json格式的数据。
TemplateHTMLRenderer
使用Django的标准模板渲染器将数据渲染为HTML格式
与其他渲染器不同,此时传递给Response 的数据不需要序列化 可能还要使用 template_name 参数,指定你要渲染的HTML模板 TemplateHTMLRenderer使用 response.data 作为上下文字典创建 RequestContext ,并确定要使用哪个模板
模板的查询规则   
                        1. 显式指定的 template_name 参数
                        2. 在TemplateHTMLRenderer上显式设置的 .template_name 属性
                        3. view.get_template_names() 方法调用的返回结果
StaticHTMLRenderer
一个简单的渲染器,只返回渲染好的HTML内容数据 与其他渲染器不同,传递给响应对象的数据应该是要返回内容的字符串形式
BrowsableAPIRenderer
可以将数据渲染为HTML页面,提供可浏览的API页面
AdminRenderer
将数据渲染为类似管理员后台界面的HTML页面 具有嵌套序列化器或序列化器列表的视图将无法正常使用 AdminRenderer
HTMLFormRenderer
将序列化程序返回的数据呈现为HTML表单 此渲染器的输出不包括封闭的 <form></form> 标签,隐藏的CSRF标签或任何提交按钮
MultiPartRenderer
渲染HTML分成多个部分的表单数据 不适合作为响应的渲染器 用于创建测试请求,使用REST框架的测试客户端和测试请求工厂方法
自定义渲染器
自定义渲染器,首先要继承 BaseRenderer 类
设置 .media_type 和 .format 属性
重写.render(self, data, media_type=None, renderer_context=None) 方法
render()方法应返回一个bytestring对象,它将用作HTTP响应的主体
.render() 参数:
         data,请求数据,由 Response() 实例化
         media_type=None,可选参数
         如果提供,则是内容协商的媒体类型
         renderer_context=None,可选参数,如果提供,则是由视图提供的上下文信息的字典。。
from django.utils.encoding import smart_unicode
from rest_framework import renderers class PlainTextRenderer(renderers.BaseRenderer):
media_type = 'text/plain'
format = 'txt'
#默认情况下,渲染器使用UTF-8 编码,要使用其他编码,设置charset
#charset = 'xxx'
def render(self, data, media_type=None, renderer_context=None):
return data.encode(self.charset)
 
'''
如果希望渲染器同时支持一系列媒体类型。在这种情况下,可以将media_type 设置为 */*
未指定渲染器的媒体类型,则应确保在使用该 content_type 属性返回响应时明确指定媒体类型
return Response(data, content_type='image/png')
'''
 

29.渲染器Renderer的更多相关文章

  1. Django-rest-framework 接口实现 分页:(Pagination) 解析器(Parser) 渲染器(renderer)

    分页:(Pagination) rest_framework 中已经定义好了 3 种 分页模式 from rest_framework.pagination import PageNumberPagi ...

  2. 基于OpenGL编写一个简易的2D渲染框架-11 重构渲染器-Renderer

    假如要渲染一个纯色矩形在窗口上,应该怎么做? 先确定顶点的格式,一个顶点应该包含位置信息 vec3 以及颜色信息 vec4,所以顶点的结构体定义可以这样: struct Vertex { Vec3 p ...

  3. 56. EditorGridPanel和渲染器renderer的使用

    转自:https://blog.csdn.net/chenkangwan/article/details/4748716?utm_source=blogxgwz6 1. 在EditorGriddPan ...

  4. CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL

    CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL +BIT祝威+悄悄在此留下版了个权的信息说: 开始 本文用step by step的方式,讲述如何使 ...

  5. three.js引擎基础知识—摄像机、场景及渲染器

    一.three.js采用右手坐标系: x轴正方向向右,y轴正方向向上,z轴由屏幕从里向外,如下图右: 二.3D编程三要素:场景.渲染器.摄像机 1.场景:创建的物品和模型都需放入场景中 threejs ...

  6. 基于OpenGL编写一个简易的2D渲染框架-08 重构渲染器-整体架构

    事实上,前面编写的渲染器 Renderer 非常简陋,虽然能够进行一些简单的渲染,但是它并不能满足我们的要求. 当渲染粒子系统时,需要开启混合模式,但渲染其他顶点时却不需要开启混合模式.所以同时渲染粒 ...

  7. 拖尾渲染器 Trail Renderer

    拖尾渲染器(Trail Renderer)用于制作跟在场景中的物体后面的拖尾效果来代表它们在到处移动. 必须给Materials一个材质渲染器设置的Colors才有效. 展示自己的一个demo...

  8. 【three.js详解之二】渲染器篇

    [three.js详解之二]渲染器篇   本篇文章将详细讲解three.js中渲染器(renderer)的设置方法. three.js文档中渲染器的分支如下: Renderers CanvasRend ...

  9. Unity 5.4大赞:HTC Vive经典The lab渲染器开源

    HTC Vive提供了一个不错的免费VR demo,最近1周仔细体验了一番. 仔细看了其安装文件,竟然是Unity 5.4beta版本(通过查log,知道Valve公司用的是最新的5.4.0b11版本 ...

随机推荐

  1. Spring源码 20 手写模拟源码

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

  2. SQL SERVER数据库服务器CPU不能全部利用原因分析

    背景 客户凌晨把HIS数据库迁移到配置更高的新服务器,上午业务高峰时应用非常缓慢,严重影响到业务运行.   1.现象 通过SQL专家云实时可视化界面看到大量的绿点,绿点表示会话在等待某项资源,绿点越大 ...

  3. java学习第三天常用类.day12

    String String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了 如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & String ...

  4. 888. 公平的糖果交换--LeetCode

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/fair-candy-swap 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 假 ...

  5. SSM整合,快速新建javaWeb项目

    整合前需要了解: spring和springmvc包扫描的注意事项 Spring applicationContext.xml (父容器),SpringMVC springmvc-servlet.xm ...

  6. idea主类main左侧栏启动按钮消失原因

    今天在开发完一个小项目后,打开idea发现我的springboot项目的启动类左侧栏的按钮消失了,然后我又去看了看mapp等文件的调转也全部消失了,我就很纳闷是不是idea配置坏了,赶忙点击导航栏的按 ...

  7. Little Girl and Problem on Trees

    题意 给定一棵无边权的树,最多只有一个点度数超过2,有两种操作 1)(0 u x d)将距离u节点d距离之内的节点的值加上x 2)(1 u)询问u节点的值 n<=100000,q<=100 ...

  8. 至少要几个砝码,可以称出 1g ~ 40g 重量

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

  9. 使用STM32控制TMC5160驱动步进电机

    首先先来了解一下TMC5160的3种工作模式 TMC5160通过两个引脚来控制它的工作模式:SD_MODE和SPI_MODE. 1.当SD_MODE接地,SPI_MODE拉高,TMC5160即工作在模 ...

  10. 【loj2538】 【PKUWC 2018】Slay the Spire dp

    我们不难发现,假设抽了x张攻击牌,y张强化牌,那么肯定是打出尽可能多张的强化牌后,再开始出攻击牌(当然最少要一张攻击牌) 我们设G(i,j)表示:所有(抽到的攻击牌牌数为i,打出的攻击牌牌数为j)的方 ...