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是怎么配置渲染器的,这样以后我们自定义渲染器也就十分简单了

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/165772.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • fcn全卷积神经网络搭建_区域卷积神经网络

    fcn全卷积神经网络搭建_区域卷积神经网络文章目录简介核心思想网络结构上采样Upsampling跳级结构CNN与FCN的区别与联系网络训练过程存在问题【参考】简介全卷积网络(FullyConvolutionalNetworks,FCN)是JonathanLong等人于2015年在FullyConvolutionalNetworksforSemanticSegmentation一文中提出的用于图像语义分割的一种框架,是深度学习用于语义分割领域的开山之作。FCN将传统CNN后面的全连接层换成了卷积层,这样网络的输出将是热力图而非类

    2022年9月25日
    0
  • 遗传算法的matlab代码_遗传算法实际应用

    遗传算法的matlab代码_遗传算法实际应用目录1、遗传算法流程2、关键参数说明(1)群体规模\(NP\)(2)交叉概率\(P_c\)(3)变异概率\(P_m\)(4)进化代数\(G\)3、MATLAB仿真实例3.1遗传算法求解一元函数的极值3.2遗传算法求解旅行商问题(TSP)4、遗传算法的特点1、遗传算法流程遗传算法的运算流程如下图所示:具体步骤如下:(1)初始化。设置进化代数计数器\(g=0\),设置最大进化代数\(G\),随机生成\(NP\)个个体作为初始群体..

    2022年9月12日
    0
  • python 数字转换字符串(python转换字符串)

    原博文2019-06-3001:20−字符串->数字:int(字符串),float(字符串)数字->字符串:str(数字)…01602相关推荐2019-12-1214:34−##Python代码块、缓存机制1.相同的字符串在Python中地址相同“`pythons1=’panda’s2=’panda’print(s1==s2…

    2022年4月16日
    75
  • Windows 7系统DNS服务器配置方法

    Windows 7系统DNS服务器配置方法DNSDNS域名系统。域名系统是一个有序、结构化系统用于计算机与互联网或连接在一个私密网络系统。每个参与者补充了一个域名,代表不同的信息。电脑系统要求数字IP地址的功能。然而,这显然是非常困难的,对一些IP地址的门外汉来说,DNS可以翻译处容易记住的域名,DNS的重要性在于它是一个目录服务的互联网。正如电话目录翻译的人的名字到他们的电话号码,DNS也是这样,它们会翻译IP地

    2022年5月22日
    31
  • 用计算机亩换算成平方,亩平米换算(平方米换算亩计算器)[通俗易懂]

    1平方米(㎡)=0.0015亩1亩=666.6666667平方米(㎡)平方米(㎡,英文:.方英里=10.763910417平方英尺=0.0015亩单位换算就是把平方米换算成平方分米、平方厘.使用国家规定的换算公式来进行换算。基本单位数量换算(按使用频率排序)。1亩=666.67平方米100平方米=0.15亩——就是农民朋友口语说的一分半地。1000平方米=1..1公顷=100公亩=10000平方…

    2022年4月9日
    431
  • dmesg 命令

    dmesg 命令dmesg 这个命令 Linux 下用的还是比较多的 现在来详细看一下 Linuxdmesg 命令用于显示开机信息 kernel 会将开机信息存储在 ringbuffer 中 您若是开机时来不及查看信息 可利用 dmesg 来查看 开机信息亦保存在 var log 目录中 名称为 dmesg 的文件里 一 语法 dmesg cn s lt 缓冲区大小 gt 二 选项 c 显示信息后

    2025年7月28日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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