Rest-framework Renderers渲染器

REST framework提供了一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。

REST framework提供了Renderer 渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换响应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理响应数据,我们可以通过配置来修改默认响应格式。

例子:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类
        'rest_framework.renderers.JSONRenderer',  # json渲染器
        'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器
    )
}

包含了返回 JSON 数据以外, 还包括了自述 API 的返回。 当然, 如果你不想在全局中设置渲染的方式, 你也可以这样:

renderer_classes指定渲染器(在使用多种渲染器的时候, 默认使用的是下标为 0 的首选渲染器, 当然你可以在你的请求头中指定 Accept

class book(RetrieveAPIView):
    queryset = BookInfo.objects.all()
    renderer_classes = (JSONRenderer, BrowsableAPIRenderer)
    serializer_class = BookInfoSerializer

再或者你使用的是装饰器的方式:

# name参数指明被装饰的方法
@method_decorator(renderer_classes([JSONRenderer, BrowsableAPIRenderer]), name='get')
class book(RetrieveAPIView):
    queryset = BookInfo.objects.all()
    # renderer_classes = (JSONRenderer, BrowsableAPIRenderer)
    serializer_class = BookInfoSerializer

 

渲染器罗列:

渲染器类

渲染类型

说明

JSONRendererapplication/json将返回数据渲染成 JSON 数据样式, 并且你可以使用 indent 媒体类型参数制定你的缩进方式, 例如 Accept: application/json; indent=4
TemplateHTMLRenderertext/html使用 Django 模板数据返回时, 将返回 HTML 类型数据, 并与其他返回数据不一样的是, 使用此渲染器返回数据不需要序列化, 但是在你创建并返回 Response 实例对象时需要制定 template_name 关键字参数
StaticHTMLRenderertext/html一个将渲染的 HTML 作为字符渲染的方式传递的渲染器
BrowsableAPIRenderertext/html将数据呈现为 Browsable API 的 HTML
AdminRenderertext/html该渲染器适用于 CRUD 样式的 WebAPI, 这些 API 也应提供用户友好的界面来管理数据
HTMLFormRenderertext/html将序列化数据呈现为 HTML, 次渲染器的输出不包含封闭的 <from> 标签以及隐藏的 CSRF 输入或任何提交按钮
MultiPartRenderermultipart/form-data; boundary=BoUnDaRyStRiNg该渲染器用于渲染 HTML 多部分表单数据, 它不适合用作响应渲染器, 而是用于使用 REST 框架的测试客户端和测试请求工厂创建测试请求

 

TemplateHTMLRenderer 视图示例:

class TemplateHTMLRendererView(ListAPIView):
    queryset = BookInfo.objects.all()[0]

    renderer_classes = (TemplateHTMLRenderer,)

    def get(self, request, *args, **kwargs):
        pk = self.kwargs['pk']
        print(pk)
        print(self.request.query_params.get('a'))
        return Response({'book': self.queryset}, template_name='index.html')

浏览器显示:

 

StaticHTMLRenderer 视图示例:

@method_decorator(renderer_classes([StaticHTMLRenderer, ]), name='get')
class bookStaticHTMLRenderer(RetrieveAPIView):
    # queryset = BookInfo.objects.all()
    # renderer_classes = (JSONRenderer, BrowsableAPIRenderer)
    # serializer_class = BookInfoSerializer

    def get(self, request, *args, **kwargs):
        data = '<html><body><h1>Hello, world</h1></body></html>'
        return Response(data)

只返回预渲染的 HTML。与其他渲染器不同,传递给响应对象的数据应该是表示要返回的内容的字符串

BrowsableAPIRenderer

为可浏览的 API 将数据渲染为 HTML:

AdminRenderer

#由于懒没写视图集
class TemplateHTMLRendererView(ListCreateAPIView,RetrieveUpdateDestroyAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    renderer_classes = (AdminRenderer,)

将数据渲染为 HTML 以进行类似管理的显示:

 

自定义渲染器 (Custom renderers)

要实现自定义渲染器,你应该重写 BaseRenderer,设置 .media_type 和 .format 属性,并且实现 .render(self, data, media_type=None, renderer_context=None) 方法。

该方法应当返回一个 bytestring,它将被用于 HTTP 响应的主体。

传递给 .render() 方法的参数是:

data

请求数据,由 Response() 例化设置。

media_type=None

可选的。如果提供,这是接受的媒体类型,由内容协商阶段确定。

根据客户端的 Accept:标头,这可能比渲染器的 media_type 属性更具体,并且可能包括媒体类型参数。例如 "application/json; nested=true"

renderer_context=None

可选的。如果提供,这是由视图提供的上下文信息的字典。

默认情况下,这将包括以下键:viewrequestresponseargskwargs

默认情况下,渲染器类被假定为使用 UTF-8 编码。要使用其他编码,请在渲染器上设置 charset 属性。

from django.utils.encoding import smart_unicode
from rest_framework import renderers


class PlainTextRenderer(renderers.BaseRenderer):
    media_type = 'text/plain'
    format = 'txt'
    charset = 'gbk'
    render_style = 'binary'
    def render(self, data, media_type=None, renderer_context=None):
        return data.encode(self.charset)

注意,如果渲染器类返回 unicode 字符串,则响应内容将被 Response 类强制为 bytestring,而设置在渲染器上的字符集属性用于确定编码。

如果渲染器返回表示原始二进制内容的字节串,则应将字符集值设置为 None,这将确保响应的 Content-Type 标头不会设置字符集值。

在某些情况下,您可能还希望将 render_style 属性设置为 'binary'。这样做也将确保可浏览 API 不会试图将二进制内容显示为字符串。

 

在某些情况下,您可能希望视图根据所接受的媒体类型使用不同的序列化样式。如果需要这样做,可以访问 request.accepted_renderer 以确定将用于响应的协商渲染器。


class ...():
renderer_classes = (TemplateHTMLRenderer,StaticHTMLRenderer)
queryset = book.objects.all()

    if request.accepted_renderer.format == 'html':
	    # TemplateHTMLRenderer 采用上下文字典,并且还需要 template_name 名称。
	    # 它不需要序列化。
        data = {'book': self.queryset}
        return Response(data, template_name='index.html')

    # JSONRenderer 需要正常的序列化数据。
    serializer = UserSerializer(instance=queryset)
    data = serializer.data
    return Response(data)

 

第三方包 (Third party packages)(随便粘贴的不保证准确性,基本用不到)

以下第三方包都是可用的。

YAML

REST framework YAML 提供 YAML 解析和渲染支持。它以前直接包含在REST framework 包中,现在被替代为第三方包支持。

安装和配置 (Installation & configuration)

使用 pip 安装。

$ pip install djangorestframework-yaml

修改您的 REST framework 设置。

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework_yaml.parsers.YAMLParser',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework_yaml.renderers.YAMLRenderer',
    ),
}

XML

REST Framework XML 提供了一个简单的非正式 XML 格式。它以前直接包含在 REST framework 包中,现在被替代为第三方包支持。

安装和配置 (Installation & configuration)

使用 pip 安装。

$ pip install djangorestframework-xml

修改您的 REST framework 设置。

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework_xml.parsers.XMLParser',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework_xml.renderers.XMLRenderer',
    ),
}

JSONP

REST framework JSONP 提供 JSONP 渲染支持。它之前直接包含在 REST framework 包中,现在被替代为第三方包支持。


警告:如果你需要跨域的 AJAX 请求,你通常应该使用更现代化的 CORS 方法代替 JSONP。有关更多详细信息,请参阅 CORS 文档

JSONP 方法本质上是一个浏览器破解,并且仅适用于全局可读的 API 端点,其中 GET 请求是未经认证的并且不需要任何用户权限。


安装和配置 (Installation & configuration)

使用 pip 安装。

$ pip install djangorestframework-jsonp

修改您的 REST framework 设置。

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework_jsonp.renderers.JSONPRenderer',
    ),
}

MessagePack

MessagePack 是一种快速,高效的二进制序列化格式。Juan Riaza 维护着 djangorestframework-msgpack 包,它为 REST framework 提供 MessagePack 渲染器和解析器支持。

CSV

逗号分隔值是纯文本表格数据格式,可以轻松导入到电子表格应用中。Mjumbe Poe 维护着 djangorestframework-csv 包,它为 REST framework 提供了 CSV 渲染器支持。

UltraJSON

UltraJSON 是一个优化的 C JSON 编码器,可以显著提高 JSON 渲染速度。Jacob Haslehurst 维护着使用 UJSON 包实现 JSON 渲染的 drf-ujson-renderer 包。

CamelCase JSON

djangorestframework-camel-case 为 REST framework 提供了驼峰式 JSON 渲染器和解析器。这使序列化程序可以使用 Python 风格的下划线字段名,但是在 API 中显示成 Javascript 样式的驼峰字段名。它由 Vitaly Babiy 维护着。

Pandas (CSV, Excel, PNG)

Django REST Pandas 提供了一个序列化器和渲染器,通过 Pandas DataFrame API 支持额外的数据处理和输出。Django REST Pandas 包括 Pandas 风格的 CSV 文件,Excel 表格(包括 .xls 和 .xlsx)以及许多其他格式的渲染器。由 S. Andrew Sheppard 维护,作为 wq 项目的一部分。

LaTeX

Rest Framework Latex 提供了一个使用 Laulatex 输出 PDF 的渲染器。它由 Pebble (S/F Software) 维护着。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值