Django REST framework 源码剖析-渲染器图解(Renderers)

Django REST framework 源码剖析-渲染器图解(Renderers)

  • 在Django REST framework (DRF) 中,渲染器(Renderers)组件承担着将后端响应数据转换为客户端可解析的格式的职责。它们是数据序列化的关键部分,确保服务器以客户端所能理解的方式返回数据。渲染器会根据客户端请求中的 Accept头来选择适当的格式, 将响应数据转换为JSON、XML、HTML等不同格式, 以适应不同类型的客户端需求。

视图调用源码

  • rest_framework.views
python 复制代码
class APIView(View):

    # The following policies may be set at either globally, or per-view.
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES

JSONRenderer源码

  • rest_framework.renderers
python 复制代码
class JSONRenderer(BaseRenderer):
    """
    Renderer which serializes to JSON.
    """
    media_type = 'application/json'
    format = 'json'
    charset = None

TemplateHTMLRenderer源码

  • rest_framework.renderers
python 复制代码
class TemplateHTMLRenderer(BaseRenderer):
    """
    An HTML renderer for use with templates.

    The data supplied to the Response object should be a dictionary that will
    be used as context for the template.

    The template name is determined by (in order of preference):

    1. An explicit `.template_name` attribute set on the response.
    2. An explicit `.template_name` attribute set on this class.
    3. The return result of calling `view.get_template_names()`.

    For example:
        data = {'users': User.objects.all()}
        return Response(data, template_name='users.html')

    For pre-rendered HTML, see StaticHTMLRenderer.
    """
    media_type = 'text/html'
    format = 'html'
    charset = 'utf-8'

StaticHTMLRenderer源码

  • rest_framework.renderers
python 复制代码
class StaticHTMLRenderer(TemplateHTMLRenderer):
    """
    An HTML renderer class that simply returns pre-rendered HTML.

    The data supplied to the Response object should be a string representing
    the pre-rendered HTML content.

    For example:
        data = '<html><body>example</body></html>'
        return Response(data)

    For template rendered HTML, see TemplateHTMLRenderer.
    """
    media_type = 'text/html'
    format = 'html'
    charset = 'utf-8'

HTMLFormRenderer源码

  • rest_framework.renderers
python 复制代码
class HTMLFormRenderer(BaseRenderer):
    """
    Renderers serializer data into an HTML form.

    If the serializer was instantiated without an object then this will
    return an HTML form not bound to any object,
    otherwise it will return an HTML form with the appropriate initial data
    populated from the object.

    Note that rendering of field and form errors is not currently supported.
    """
    media_type = 'text/html'
    format = 'form'
    charset = 'utf-8'

BrowsableAPIRenderer源码

  • rest_framework.renderers
python 复制代码
class BrowsableAPIRenderer(BaseRenderer):
    """
    HTML renderer used to self-document the API.
    """
    media_type = 'text/html'
    format = 'api'
    charset = 'utf-8'

AdminRenderer源码

  • rest_framework.renderers
python 复制代码
class AdminRenderer(BrowsableAPIRenderer):
    template = 'rest_framework/admin.html'
    format = 'admin'

DocumentationRenderer源码

  • rest_framework.renderers
python 复制代码
class DocumentationRenderer(BaseRenderer):
    media_type = 'text/html'
    format = 'html'
    charset = 'utf-8'

SchemaJSRenderer源码

  • rest_framework.renderers
python 复制代码
class SchemaJSRenderer(BaseRenderer):
    media_type = 'application/javascript'
    format = 'javascript'
    charset = 'utf-8'

MultiPartRenderer源码

  • rest_framework.renderers
python 复制代码
class MultiPartRenderer(BaseRenderer):
    media_type = 'multipart/form-data; boundary=BoUnDaRyStRiNg'
    format = 'multipart'
    charset = 'utf-8'

CoreJSONRenderer源码

  • rest_framework.renderers
python 复制代码
class CoreJSONRenderer(BaseRenderer):
    media_type = 'application/coreapi+json'
    charset = None
    format = 'corejson'

全局渲染器配置示例

python 复制代码
REST_FRAMEWORK = {
	'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ]
}

局部解析器配置示例

python 复制代码
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):
    """
    A view that returns the count of active users in JSON.
    """
    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)

基于函数视图的解析器配置示例

python 复制代码
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.response import Response
from myproject.models import User


@api_view(['GET'])
@renderer_classes([JSONRenderer])
def user_count_view(request, format=None):
    """
    A view that returns the count of active users in JSON.
    """
    user_count = User.objects.filter(active=True).count()
    content = {'user_count': user_count}
    return Response(content)

自定义渲染器示例

  • data 请求数据,由 Response() 实例化设置。
  • accepted_media_type 内容协商阶段确定的可接受的媒体类型。
  • renderer_context 视图提供的上下文信息字典。
python 复制代码
from django.utils.encoding import smart_unicode
from rest_framework import renderers


class PlainTextRenderer(renderers.BaseRenderer):
    media_type = 'text/plain'
    format = 'txt'

    def render(self, data, media_type=None, renderer_context=None):
        return data.encode(self.charset)

高级渲染器用法

python 复制代码
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.response import Response
from myproject.models import User
from myproject.serializer import UserSerializer


@api_view(('GET',))
@renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def list_users(request):
    """
    可以返回系统中用户的 JSON 或 HTML 表示的视图。
    """
    queryset = Users.objects.filter(active=True)

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

    # JSONRenderer 需要正常的序列化数据。
    serializer = UserSerializer(instance=queryset)
    data = serializer.data
    return Response(data)
相关推荐
MZ_ZXD00111 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
wqq631085516 小时前
Python基于Vue的实验室管理系统 django flask pycharm
vue.js·python·django
Q_Q196328847516 小时前
python大学生爱心校园互助代购网站_nyvlx_django Flask vue pycharm项目
python·django·flask
wxin_VXbishe21 小时前
C#(asp.net)学员竞赛信息管理系统-计算机毕业设计源码28790
java·vue.js·spring boot·spring·django·c#·php
码界筑梦坊21 小时前
330-基于Python的社交媒体舆情监控系统
python·mysql·信息可视化·数据分析·django·毕业设计·echarts
码界筑梦坊1 天前
325-基于Python的校园卡消费行为数据可视化分析系统
开发语言·python·信息可视化·django·毕业设计
码界筑梦坊1 天前
327-基于Django的兰州空气质量大数据可视化分析系统
python·信息可视化·数据分析·django·毕业设计·数据可视化
WangYaolove13141 天前
基于python的在线水果销售系统(源码+文档)
python·mysql·django·毕业设计·源码
意疏2 天前
程序员兼职如何选择靠谱的软件外包平台 与 我的避坑经验
django
vx_biyesheji00012 天前
豆瓣电影推荐系统 | Python Django 协同过滤 Echarts可视化 深度学习 大数据 毕业设计源码
大数据·爬虫·python·深度学习·django·毕业设计·echarts