返回顶部
首页 > 资讯 > 后端开发 > Python >Django drf请求模块源码解析
  • 950
分享到

Django drf请求模块源码解析

2024-04-02 19:04:59 950人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

DRF 框架,全称为 Django Rest Framework,是 DjanGo 内置模块的扩展,用于创建标准化 RESTful api;它利用 ORM 映射数据库,并自定义序列化

DRF 框架,全称为 Django Rest Framework,是 DjanGo 内置模块的扩展,用于创建标准化 RESTful api;它利用 ORM 映射数据库,并自定义序列化数据进行返回,多用于前后端分离项目

项目地址:

https://GitHub.com/encode/django-rest-framework

请求模块:request对象

源码入口

APIView类中dispatch方法中的:request=self.iniialize_request(*args, **kwargs),源码如下:


def initialize_request(self, request, *args, **kwargs):
    """
    Returns the initial request object.
    """
    parser_context = self.get_parser_context(request)

    return Request(
        request,
        parsers=self.get_parsers(),
        authenticators=self.get_authenticators(),
        negotiator=self.get_content_negotiator(),
        parser_context=parser_context
    )

源码分析

源码很简单,第1句parser_context = self.get_parser_context(request),我们进入方法get_parser_context查看源码:


"""
Returns a dict that is passed through to Parser.parse(),
as the `parser_context` keyWord argument.
"""
# Note: Additionally `request` and `encoding` will also be added
#       to the context by the Request object.
return {
    'view': self,
    'args': getattr(self, 'args', ()),
    'kwargs': getattr(self, 'kwargs', {})
}

上面的代码的意思是:返回一个解析的字典以便于Parser.parse()去解析,另外还通过Request对象添加了上下文requestencoding

第二句返回了一个Request对象,点击进入查看

我们可以分析出,内部对request做了二次封装,_request是一个HttpRequest对象,并且Request类中还有__getattr__此方法,代码如下:


def __getattr__(self, attr):
    """
    If an attribute does not exist on this instance, then we also attempt
    to proxy it to the underlying HttpRequest object.
    """
    try:
        return getattr(self._request, attr)
    except AttributeError:
        return self.__getattribute__(attr)

意思是如果这个实例上不存在一个属性,那么我们也会尝试将其代理到底层HttpRequest对象。接下来我们可以通过案例演示

案例演示

我们创建了TestView视图,视图函数中打印了3个request属性,并且在response上打了一个断点,接下来通过url访问视图,进入断点如下,

我们可以清楚的看到:

  • request是drfRequest对象
  • request下有data属性,query_params属性,但是没有GET属性

上面还有一个Protected Attributes属性,里面包含了_request属性

我们可以看到_requestWSGIHttpRequest对象,所以它会有GET属性,所以我们视图中打印的request.GET实际上和request._request.GET是一样的,因为request没有GET属性,所以它就会访问_request中的GET属性,最后我们查看打印结果,如下:


<QueryDict: {'a': ['1']}>
<QueryDict: {'a': ['1']}>
<QueryDict: {'a': ['1']}>

同样的,POST请求也是如此,我们在视图中添加POST的请求方式,如下:


def post(self, request, *args, **kwargs):
    print(request.POST)  # 兼容
    print(request._request.POST)  # 二次封装
    print(request.data)  # 拓展,兼容性最强,3种请求方式都可以
    return Response("drf post ok")

我们都知道提交数据一般有3种方式

  • multipart/form-data
  • application/x-www-form-urlencoded
  • application/JSON

首先我们使用multipart/form-data提交请求数据,并请求API

我们查看PyCharm打印结果


<QueryDict: {'a': ['1']}>
<QueryDict: {'a': ['1']}>
<QueryDict: {'a': ['1']}>

可以看到multipart/form-data这种请求方式,都能打印出来

接着我们使用application/x-www-form-urlencoded提交请求数据,并请求API


<QueryDict: {'a': ['1']}>
<QueryDict: {'a': ['1']}>
<QueryDict: {'a': ['1']}>

可以看到application/x-www-form-urlencoded这种请求方式,都能打印出来

最后我们使用application/json提交请求数据,并请求API

可以看到application/json这种请求方式,只有request.data能打印出来


<QueryDict: {}>
<QueryDict: {}>
{'a': 1}

所以request.data兼容性最强

总结drfrequest进行了二次封装,request._request就是原生的WSGIRequest原生request的属性和方法都可以被drfrequest对象直接访问(兼容)drf请求的所有url拼接参数均被解析到query_params中,所有的数据包均被解析到data中其中post请求,request.data的兼容性最强,能兼容前台传输的json格式的数据

到此这篇关于Django(48)drf请求模块源码分析 的文章就介绍到这了,更多相关Django drf源码内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Django drf请求模块源码解析

本文链接: https://lsjlt.com/news/127781.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Django drf请求模块源码解析
    DRF 框架,全称为 Django Rest Framework,是 Django 内置模块的扩展,用于创建标准化 RESTful API;它利用 ORM 映射数据库,并自定义序列化...
    99+
    2024-04-02
  • SpringMVC请求流程源码解析
    目录一、SpringMVC使用1.工程创建2.工程配置3.启动工程二、SpringMVC启动过程1.父容器启动过程2.子容器启动过程(SpringMvc容器)3.九大组件的初始化1....
    99+
    2024-04-02
  • 【Spring6源码・MVC】请求处理流程源码解析
    上一篇《【Spring6源码・MVC】初始化registry,完成url和controller的映射关系》我们知道,在IOC容器加载的同时,初始化了registry这个HashMap,这个HashMa...
    99+
    2023-09-04
    mvc java spring
  • Java源码解析之Gateway请求转发
    Gateway请求转发 本期我们主要还是讲解一下Gateway,上一期我们讲解了一下Gateway中进行路由转发的关键角色,过滤器和断言是如何被加载的,上期链接://www.jb51...
    99+
    2024-04-02
  • Tomcat源码解析之Web请求与处理
    目录前言一、EndPoint二、ConnectionHandler三、Coyote四、容器责任链模式前言 Tomcat最全UML类图 Tomcat请求处理过程: Connecto...
    99+
    2024-04-02
  • Java struts2请求源码分析案例详解
      Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不...
    99+
    2024-04-02
  • MyBatis源码解析之Transaction事务模块
    目录1、回顾2、事务模块2.1 事务接口2.2 MyBatis事务类型2.3 JDBC事务模型2.4 关于自动提交2.5 问题1、回顾 之前介绍了Environment环境类,这其实...
    99+
    2024-04-02
  • vue3模块创建runtime-dom源码解析
    目录前言创建模块nodeOptionspatchPropspatchProppatchClasspatchStylepatchEventpatchAttr总结前言 runtime-...
    99+
    2023-01-12
    vue3 runtime-dom模块创建 vue3 runtime-dom
  • nodejs模块系统源码分析
    目录概述CommonJS 规范Node 对 CommonJS 规范的实现模块导出以及引用模块系统实现分析模块定位加载策略模块加载模块文件处理后缀处理编译执行概述 Node.js的出现...
    99+
    2024-04-02
  • Node.js模块系统源码分析
    这篇文章主要介绍“Node.js模块系统源码分析”,在日常操作中,相信很多人在Node.js模块系统源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node.js模块系...
    99+
    2024-04-02
  • Django的admin源码浅析和模仿
    admin模块: admin提供了5种接口 list_display, 指定数据展示字段,不能放多对多字段 list_display_link,哪个字段可以链接   search_fields,搜索框 search_fiekds ...
    99+
    2023-01-31
    源码 Django admin
  • 解析django的csrf跨站请求伪造
    目录1.什么是跨站请求伪造2.如何规避跨站请求伪造(csrf校验)3.如何符合csrf校验3.1 form表单如何符合校验3.2 ajax如何符合校验4.csrf相关的装饰器4.1 ...
    99+
    2024-04-02
  • Mybatis源码分析之插件模块
    Mybatis插件模块 插件这个东西一般用的比较少,就算用的多的插件也算是PageHelper分页插件; PageHelper官网:https://github.com/pagehe...
    99+
    2024-04-02
  • #6 ipdb模块源代码解读
    前言 好久不见,大家最近可好。通过前几节的学习,相信你已经掌握了面向对象的大量知识,但是光知道是不够的,需要自己多写、多看,学一门语言无非不过这两种秘诀嘛。因此本篇博文带着大家剖析一次源代码,剖析对象为代码调试模块:ipdb。为什么选择这...
    99+
    2023-01-30
    源代码 模块 ipdb
  • SaltStack源码分析之使用MongoDB模块
    MongoDB模块/usr/lib/python2.6/site-packages/salt/modules/mongodb.pyMongoDB模块会先去检查是否安装有PyMongo模块# -*-...
    99+
    2024-04-02
  • Flutter网络请求框架Dio源码分析以及封装(一)--请求流程分析
    Flutter网络请求框架Dio源码分析以及封装--请求流程分析 前言目的请求流程-构造Dio对象请求流程-构造请求参数请求流程-构建请求流并添加拦截器请求流程-请求分发总结 前言 利用...
    99+
    2023-09-01
    flutter
  • Python接口自动化之浅析requests模块get请求
    一、requests模块说明 介绍 Requests是Python语言的第三方的库,专门用于发送HTTP请求。 特点 1.Requests支持HTTP连接保持和连接池,支持使用coo...
    99+
    2024-04-02
  • Python接口自动化之浅析requests模块post请求
    在上一篇Python接口自动化测试系列文章:Python接口自动化之浅析requests模块get请求,介绍了requests模块、get请求及响应结果详解。接下来介绍request...
    99+
    2024-04-02
  • Python Django源码运行过程解析
    目录一、Django运行顺序1.启动1.1 命令行启动(测试服务器)2.监听2.1 runserver(测试服务器)3.中间件的执行本文只算是本人片面之言(当然也会借鉴网络上公开资料...
    99+
    2024-04-02
  • python django事务实例源码解析
    这篇文章主要讲解了“python django事务实例源码解析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python django事务实例源码解析”吧!python Django事务#&...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作