首页 > 其他分享 >29.渲染器Renderer

29.渲染器Renderer

时间:2022-09-19 18:44:04浏览次数:64  
标签:None 渲染器 指定 29 HTML Renderer type renderer

什么是渲染器     渲染器就是将服务器生成的数据格式转为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')
'''
 

标签:None,渲染器,指定,29,HTML,Renderer,type,renderer
From: https://www.cnblogs.com/Mickey-7/p/16708654.html

相关文章

  • 29. Activity组件
    29.Activity组件29.1认识Activity应用画面→ActivityActivity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。Activity中所有操作都与用户密切相......
  • 2022-9-18 #29 愿灰飞烟灭 我的每个昨天
    CSP-S初赛,新赛季第一战。打的一般吧,虽说检查了很多遍但还是出了很多计算错误。。。大端小端是什么......
  • 2022.8.29~2022.9.6 whk 记录
    Content[CF474F]Antcolony\(n\)个数\(a_{1\simn}\),\(m\)次询问,每次给出\([l,r]\),求所有不满足\(\forallj\in[l,r],a_i|a_j\)的\(i\)的数量。\(1\len,m\le......
  • 最新资讯|2022年8月29日,IECEE发布电池认证CTL协议DSH1037A!
    2022年8月29日,IECEE发布电池认证CTL协议DSH1037A,涉及标准IEC62133:2002,IEC62133:2012,IEC62133-1:2017,IEC62133-2:2017,IEC62619:2017,IEC62660-3:2016,CTL协议DSH103......
  • 2022-08-29 day37 第一小组 王鸣赫
    目录JAVAweb一,软件架构二,资源分类三,常见的wed服务器四,常见的服务器软件动态服务器静态服务器TomcatTomcat的启动Tomcat的关闭访问五,Tomcat部署项目六,ServletServlet创建Se......
  • Qt-C2429:语言功能"嵌套命名空间定义"需要编译器标志"/std:c++latest"
     问题现象:今天早上在给同事讲代码时,打开工程,发现之前可以编译的工程,在未修改代码,未修改SDK的情况下,无法编译。并且提示如下:C2429:语言功能"嵌套命名空间定义"需要编译器......
  • 20201329魏赫学习笔记一
    20201329信息安全系统设计与实现学习笔记①作业信息作业要求https://www.mosoteach.cn/web/index.php?c=interaction_homework&m=s_write&clazz_course_id=7C854F......
  • [Google] LeetCode 329 Longest Increasing Path in a Matrix 记忆化搜索
    Givenanmxnintegersmatrix,returnthelengthofthelongestincreasingpathinmatrix.Fromeachcell,youcaneithermoveinfourdirections:left,right......
  • CVE-2022-22978 Spring-Security 漏洞复现
    1说明在SpringSecurity中使用RegexRequestMatcher且规则中包含带点号的正则表达式时,攻击者可以通过构造恶意数据包绕过身份认证2环境搭建环境搭建地址可以参考如下的......
  • 29. 牛客-一人行者
    本来不想为了这题写一篇博客的,但因为昨天被一组数据卡了一个小时,还是有必要来记录一下。牛客练习赛102D:一人行者题意是给一棵树,求断掉每一条边后得到的两棵树各自的联通......