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

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

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

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


相关推荐

  • jdk14下载与安装教程(win10)超详细

    jdk14下载与安装教程(win10)超详细一、前言现在jdk已经升级到JDK14版本了,这里也记录一下jdk14的下载及安装过程,对于刚学习java的小伙伴可以参考,熟手可忽略,呵呵~二、下载安装步骤一、首先是去jdk官网下载,官网下载还需要注册,如果大家不怕麻烦的话可以去官网下载,下载速度也是龟速,我也是花了好长时间才下载下来,大家可以点击我的网盘目录jdk目录下载,目录也有其它低版本的,如果有需要大家根据需要自行选择。…

    2022年5月26日
    187
  • 一个量化交易策略师的自白

    一个量化交易策略师的自白转一个量化交易策略师的自白    我之前在全球top5券商工作时也主要以CTA研究为主,每天都在不停的进行各种回测和开发。彼时,部门的CTA交易主要集中在股指期货的日内投机上,基本市场上能搜集到的各种书籍和报告我都浏览过。不过,从实际运用的角度来看,不同的技术分析方法,指标类切线类也好,形态类波浪类也罢,无论其历史背景和基本原理如何,其实质都是基…

    2022年6月26日
    32
  • java 替换回车换行符

    java 替换回车换行符场景 数据库存储了页面保存进来的分行文字 有隐含的 CRLF h5 显示时 没有特殊处理 所以不会换行 处理方法 将字符串的换行替换成 HTML 的换行符号 paramstr return publicstatic Stringstr returnstr replaceA

    2025年6月12日
    4
  • pycharm2021linux 激活码【在线注册码/序列号/破解码】

    pycharm2021linux 激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    75
  • ELK搭建开源日志系统(window版本)—图文详细

    ELK搭建开源日志系统(window版本)—图文详细ELK搭建开源日志系统(window版本)—图文详细日志对于排查错误非常重要,使用linux命令awksedgrepfind等命令查询日志非常麻烦,而且很难做数据分析,使用免费开源的ELK可以支撑大规模的日志检索,本文将一步步教怎么快速搭建一个window版本的ELK日志收集系统。下载elasticsearch、logstash、kibana、filebeat注意同一系列的版本要一样,防止出现版本不兼容问题,本文使用7.16.0版本,在window系统演示下载elasticsearch访问地

    2022年8月30日
    3
  • MySQL (4) 第一范式 第二范式 第三范式 BC范式

    MySQL (4) 第一范式 第二范式 第三范式 BC范式第一范式第一范式:所有属性都是不可分割的原子值。也就是每个属性都是不可再分的。例如下图就不符合第一范式的要求实际上,1NF是所有关系型数据库的最基本要求,你在关系型数据库管理系统(RDBMS),例如SQLServer,Oracle,MySQL中创建数据表的时候,如果数据表的设计不符合这个最基本的要求,那么操作一定是不能成功的。如果我们要在RDBMS中表现表中的数据,就得设计为下图的

    2022年5月23日
    48

发表回复

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

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