django 渲染_django开源项目

django 渲染_django开源项目前言渲染模块的原理和解析模块是一样,drf默认的渲染有2种方式,一种是json格式,另一种是模板方式。渲染模块源码入口入口:APIView类中dispatch方法中的:self.response

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

渲染模块的原理和解析模块是一样,drf默认的渲染有2种方式,一种是json格式,另一种是模板方式。
 

渲染模块源码入口

入口:APIView类中dispatch方法中的:self.response = self.finalize_response(request, response, *args, **kwargs)
 

渲染模块源码分析

我们首先点击finalize_response进入查看源码

def finalize_response(self, request, response, *args, **kwargs):
    """
    Returns the final response object.
    """
    # Make the error obvious if a proper response is not returned
    # 断言是否是HttpResponseBase对象
    assert isinstance(response, HttpResponseBase), (
        'Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` '
        'to be returned from the view, but received a `%s`'
        % type(response)
    )
    
    # 判断是否是Response对象
    if isinstance(response, Response):
        if not getattr(request, 'accepted_renderer', None):
            # 渲染模块的正式入口
            neg = self.perform_content_negotiation(request, force=True)
            request.accepted_renderer, request.accepted_media_type = neg

        response.accepted_renderer = request.accepted_renderer
        response.accepted_media_type = request.accepted_media_type
        response.renderer_context = self.get_renderer_context()

    # Add new vary headers to the response instead of overwriting.
    vary_headers = self.headers.pop('Vary', None)
    if vary_headers is not None:
        patch_vary_headers(response, cc_delim_re.split(vary_headers))

    for key, value in self.headers.items():
        response[key] = value

    return response

上述代码是响应模块的源码,该源码中包含了渲染模块的源码,就是这句neg = self.perform_content_negotiation(request, force=True),我们可以点击查看

def perform_content_negotiation(self, request, force=False):
    """
    Determine which renderer and media type to use render the response.
    """
    # 确定使用哪种渲染器和媒体类型来渲染响应。
    # 渲染器列表
    renderers = self.get_renderers()
    conneg = self.get_content_negotiator()

    try:
        return conneg.select_renderer(request, renderers, self.format_kwarg)
    except Exception:
        if force:
            return (renderers[0], renderers[0].media_type)
        raise

代码中有个get_renderers就是渲染器列表,点击查看

def get_renderers(self):
    """
    Instantiates and returns the list of renderers that this view can use.
    """
    return [renderer() for renderer in self.renderer_classes]

这就是渲染器列表的源码,跟解析器列表的源码大同小异,接着再点击renderer_classer查看

renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES

到这里我们就知道了,drf默认的渲染器在settings下的DEFAUIT_RENDERER_CLASSES中,配置如下

'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],

如果我们想局部配置渲染器,只需在自己定义的视图类中添加render_classes 即可,一般也不用做修改,以上分析只是让大家知道drf是怎么配置渲染器的,这样以后我们自定义渲染器也就十分简单了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/164890.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 渗透测试文章_黑客秘笈-渗透测试实用指南

    渗透测试文章_黑客秘笈-渗透测试实用指南【拿shell】1.直接上传aspasajspcerphpaspxhtrcdx格式的木马,不行就利用IIS6.0解析漏洞”:1.asp;1.jpg/1.asp;.jpg/1.asp;jpg/1.asp;.xls2.上传图片木马遇到拦截系统,连图片木马都上传不了,记事本打开图片木马在代码最前面加上gif89a,一般就能逃过拦截系统了。3.上传图片木马把地址复制到…

  • WPF 教程(wpf架构)

    WPF介绍了一个非常方便的概念:把数据储存为一种资源,无论是本地控件、本地窗口还是全局应用。数据可以是任何你想要的东西,从实际的信息到WPF控件的层次结构都行。这非常有用,你可以把数据放在一个地方,然后在其他地方调用它。这个概念被广泛用在样式和模版,我们后面会详细讲到。也可以用在很多别的地方,就像本章要说明的地方,例子如下:

  • 床长人工智能教程 下载_人工智能

    床长人工智能教程 下载_人工智能目录请先点击下面查看序言序言1神经网络与深度学习1.1介绍神经网络1.1.1什么是神经网络1.1.2监督学习型神经网络1.1.3什么使深度学习火起来了1.2神经网络基础1.2.1如何将待预测数据输入到神经网络中1.2.2神经网络是如何进行预测的1.2.3神经网络如何判断自己预测得是否准确1

  • Java中怎样由枚举常量的ordinal值获得枚举常量对象

    Java中怎样由枚举常量的ordinal值获得枚举常量对象

    2021年12月15日
  • 联想笔记本BIOS设置中文_笔记本电脑 英文

    联想笔记本BIOS设置中文_笔记本电脑 英文对于很多新装系统的小伙伴们可能很多都不是太懂BIOS中都是干什么用的,小编这里给大家详细介绍一下联想笔记本的主板BIOS设置跟别的笔记本或许有些不同但大体相差不多,和大家分享一下。BIOS介绍

  • 怎么更改wifi频段_TP-Link无线路由器怎么修改无线信道和频段「建议收藏」

    怎么更改wifi频段_TP-Link无线路由器怎么修改无线信道和频段「建议收藏」有时候为了减少WiFi信道干扰,我们会修改一下路由器的信号频段,下面本文以TPLinkTL-WDR6300无线路由器为例,教大家如何改无线改信号频段,以下是具体的设置教程。改路由器信号频段可以在电脑或手机中完成,修改比较简单,下面以PC为例,手机上也是一样的,借助浏览器就可以完成操作。1、首先打开浏览器,然后输入TPLink路由器管理员登录地址:tplogin.cn(也可以是192.168….

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号