【Django Rest framework】Renderers篇翻译及应用举例

内容介绍

结合前端模板进行数据渲染,可视化目标。

项目配置

全局设置,项目的settings.py中

REST_FRAMEWORK = {
    
    
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ]
}

非全局设置(不推荐)

# 方式 1
from django.contrib.auth.models import User
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response
from rest_framework.views import APIView

class UserCountView(APIView):
    """
    Json显示获取用户的count值
    """
    renderer_classes = [JSONRenderer]

    def get(self, request, format=None):
        user_count = User.objects.filter(active=True).count()
        content = {
    
    'user_count': user_count}
        return Response(content)

# 方式 2
@api_view(['GET'])
@renderer_classes([JSONRenderer])
def user_count_view(request, format=None):
    """
    Json显示获取用户的count值
    """
    user_count = User.objects.filter(active=True).count()
    content = {
    
    'user_count': user_count}
    return Response(content)

渲染器布局

渲染器类 渲染类型 说明
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, 次渲染器的输出不包含封闭的 标签以及隐藏的 CSRF 输入或任何提交按钮
MultiPartRenderer multipart/form-data; boundary=BoUnDaRyStRiNg 该渲染器用于渲染 HTML 多部分表单数据, 它不适合用作响应渲染器, 而是用于使用 REST 框架的测试客户端和测试请求工厂创建测试请求

响应数据举例

  1. JSONRenderer
{
    
    
    "unicode black star": "★",
    "value": 999
}
  1. TemplateHTMLRenderer
class UserDetail(generics.RetrieveAPIView):
    """
    A view that returns a templated HTML representation of a given user.
    """
    queryset = User.objects.all()
    renderer_classes = [TemplateHTMLRenderer]

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        return Response({
    
    'user': self.object}, template_name='user_detail.html')
  1. StaticHTMLRenderer
@api_view(['GET'])
@renderer_classes([StaticHTMLRenderer])
def simple_html_view(request):
    data = '<html><body><h1>Hello, world</h1></body></html>'
    return Response(data)
  1. BrowsableAPIRenderer
    在这里插入图片描述
  2. AdminRenderer
    带有嵌套或列表化序列器作为其输入的视图将不适用于 AdminRenderer,因为 HTML 表单无法正确支持并且当你的数据中配置了正确的 URL_FIELD_NAME 属性时才能够正确的指向详情信息页的链接.
class AccountSerializer(serializers.ModelSerializer):
    url = serializers.CharField(source='get_absolute_url', read_only=True)

    class Meta:
        model = Account
  1. HTMLFormRenderer
    不能直接使用此渲染器, 而是可以通过将序列化实例对象传递给 render_form 模板标签在模板中使用。
{
    
    % load rest_framework %}

<form action="/submit-report/" method="post">
    {
    
    % csrf_token %}
    {
    
    % render_form serializer %}
    <input type="submit" value="Save" />
</form>

第三方组件

所有的插件根据实际情况进行选择使用。

  1. YAML
pip install djangorestframework-yaml

此时数据以 YAML 语法作为支持和返回, 在 settings.py 中调整

REST_FRAMEWORK = {
    
    
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework_yaml.parsers.YAMLParser']'DEFAULT_RENDERER_CLASSES': [
        'rest_framework_yaml.renderers.YAMLRenderer']}
  1. XML
pip install djangorestframework-xml

此时数据以 XML 语法作为支持和返回, 在 settings.py 中调整

REST_FRAMEWORK = {
    
    
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework_xml.parsers.XMLParser']'DEFAULT_RENDERER_CLASSES': [
        'rest_framework_xml.renderers.XMLRenderer']}
  1. JSONP
    如果需要跨域 AJAX 请求, 通常应该使用 CORS 的更现代方法作为的替代方法 JSONP,而该方法本质上是一种浏览器黑客,并且仅适用于全局可读的 API 端点,GET 请求未经身份验证并且不需要任何用户权限。
pip install djangorestframework-jsonp

在 settings.py 中调整

REST_FRAMEWORK = {
    
    
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework_jsonp.renderers.JSONPRenderer']}
  1. MessagePack
    MessagePack 是一种快速高效的二进制序列化格式, Juan Riaza 维护 djangorestframework-msgpack 软件包, 该软件包为 REST 框架提供 MessagePack 渲染器和解析器支持。
  2. XLSX
pip install drf-renderer-xlsx

在 settings.py 中调整

REST_FRAMEWORK = {
    
    
    ...

    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer''rest_framework.renderers.BrowsableAPIRenderer''drf_renderer_xlsx.renderers.XLSXRenderer']}

为了避免流传输的文件没有文件名(浏览器通常将其默认为没有扩展名的 download), 我们需要使用 mixin 覆盖 Content-Disposition标头, 如果未提供文件名则默认为 data.xlsx。

from rest_framework.viewsets import ReadOnlyModelViewSet
from drf_renderer_xlsx.mixins import XLSXFileMixin
from drf_renderer_xlsx.renderers import XLSXRenderer

from .models import MyExampleModel
from .serializers import MyExampleSerializer

class MyExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
    queryset = MyExampleModel.objects.all()
    serializer_class = MyExampleSerializer
    renderer_classes = [XLSXRenderer]
    filename = 'data.xlsx'

  1. CSV
    逗号分隔的值是纯文本格式的表格数据格式, 可以轻松地导入电子表格应用程序中, Mjumbe Poe 维护 djangorestframework-csv 软件包, 该软件包为 REST 框架提供 CSV 渲染器支持。
  2. UltraJSON
    经过优化的 C JSON 编码器, 可以显着加快 JSON 渲染速度, Jacob Haslehurst 维护了 drf-ujson-renderer 软件包, 该软件包使用 UJSON 软件包实现 JSON 呈现。
  3. Pandas (CSV, Excel, PNG)
    Django REST Pandas 提供了序列化器和渲染器,支持通过 Pandas DataFrame API 进行其他数据处理和输出,Django REST Pandas 包括用于 Pandas 样式 CSV 文件、Excel工作簿(包括 .xls 和 .xlsx)以及许多其他格式的渲染器,由 S. Andrew Sheppard 作为 wq Project 的一部分进行维护。
  4. LaTeX
    Rest Framework Latex 提供了一个渲染器, 该渲染器使用 Laulatex 输出 PDF, 它由 Pebble (S/F Software) 维护。

猜你喜欢

转载自blog.csdn.net/qq_20288327/article/details/112992653