概述
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
渲染器罗列:
渲染器类 | 渲染类型 | 说明 |
---|---|---|
JSONRenderer | application/json | 将返回数据渲染成 JSON 数据样式, 并且你可以使用 indent 媒体类型参数制定你的缩进方式, 例如 Accept: application/json; indent=4 |
TemplateHTMLRenderer | text/html | 使用 Django 模板数据返回时, 将返回 HTML 类型数据, 并与其他返回数据不一样的是, 使用此渲染器返回数据不需要序列化, 但是在你创建并返回 Response 实例对象时需要制定 template_name 关键字参数 |
StaticHTMLRenderer | text/html | 一个将渲染的 HTML 作为字符渲染的方式传递的渲染器 |
BrowsableAPIRenderer | text/html | 将数据呈现为 Browsable API 的 HTML |
AdminRenderer | text/html | 该渲染器适用于 CRUD 样式的 WebAPI, 这些 API 也应提供用户友好的界面来管理数据 |
HTMLFormRenderer | text/html | 将序列化数据呈现为 HTML, 次渲染器的输出不包含封闭的 <from> 标签以及隐藏的 CSRF 输入或任何提交按钮 |
MultiPartRenderer | multipart/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
可选的。如果提供,这是由视图提供的上下文信息的字典。
默认情况下,这将包括以下键:view
, request
, response
, args
, kwargs
。
默认情况下,渲染器类被假定为使用 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) 维护着。
最后
以上就是多情月饼为你收集整理的Rest-framework Renderers渲染器的全部内容,希望文章能够帮你解决Rest-framework Renderers渲染器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复