DRF中的请求入口分析及request对象分析

embedded/2024/10/18 0:33:16/

DRF中的请求入口分析及request对象分析

django restframework框架是在django的基础上又给我们提供了很多方便的功能,让我们可以更便捷基于django开发restful API

1 drf项目

pip install django
pip install djangorestframework
1.1 核心配置
python">INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',"app01.apps.App01Config",'rest_framework',
]
1.2 路由
python">from django.urls import path
from api import viewsurlpatterns = [path('users/', views.UserView.as_view()),
]
1.3 视图
python">from rest_framework.views import APIView
from rest_framework.response import Responseclass UserView(APIView):def get(self, request):return Response("...")
1.4 drf请求入口分析

在这里插入图片描述

3.2 request和参数

drf中的request和django中的request不一样,实际上是对django的request参数进行再封装

在这里插入图片描述

可以看到,在Django中request是WSGIRequest对象;而在drf中的request是rest_framework.request.Request对象

3.2.1 参数
  • 普通路由通过self.kwargs可以拿到请求的路由中传递的参数

    在这里插入图片描述

  • 含正则表达式的路由通过self.args拿到路由中传递的参数

    在这里插入图片描述

3.2.2 request对象
1.源码分析

在路由入口dispatch中,有一个函数initialize_request(request, *args, **kwargs)

在这里插入图片描述

再来看函数initialize_request(request, *args, **kwargs)具体干了些啥

这个函数将原来的Django中的request当作参数传入,返回的其实也是一个Request对象

在这里插入图片描述

而在Request对象源码中,将本来的Django的request赋值为_request

在这里插入图片描述

同时在源码中,有一个__getattr__方法,这个方法的作用是,如果我访问了类中一个不存在的变量时,就会执行这个__getattr__方法,并返回

在这里插入图片描述

也就是说,我可以通过request._request.xxx获取到原本django中的request对象里面的值,

也可以通过request.xxx同时获取到drf和django两者request对象里面的值

request.xxx获取到django中request对象里面的值的原理是:当访问不到时,会执行__getattr__方法,通过反射的方法,此时相当于执行request._request.xxx

2.request对象获取值在这里插入图片描述

http://www.ppmy.cn/embedded/28005.html

相关文章

排序算法--冒泡排序

前提: 交换排序:根据序列中两个值的比较结果来交换这两个数在序列中的位置,交换排序的特点是:将值较大的数向序列的尾部移动,值较小的数向序列的前部移动。 算法分析: 冒泡排序,英语名是Bubble…

【16-Ⅰ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础,通过阅读Java廖雪峰网站,简单速成了java,但对其中一些入门概念有所疏漏,阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

云计算与云服务

什么是云计算 云计算是指通过 Internet 提供的计算服务。 计算服务包括常见的 IT 基础结构,例如虚拟机、存储、数据库和网络。 云服务还扩充了传统的 IT 产品/服务,包括物联网 (IoT)、机器学习 (ML) 以及人工智能 (AI) 等。 定义云模型 什么是云模型&…

Mac Word文档没保存但是word突然卡住

参考博客的解决方案: https://www.jianshu.com/p/148cf8c9571d 思路:通过活动监视器找到Microsoft word的程序启动地址,在前往-前往文件夹中输入地址,到程序所在的文件夹,双击启动一个新的word程序,将当前…

iOS(Object C) 递归方法求和

有等差数列1,2,3,4,5使用递归方法求和: - (int)sum:(int)value {if (value >5){return self.count;}//在外面定义一个全局变量self.count,初始值为0self.count [self sum:value1] value;return self.count; } 调用验证: self.count 0; int result [self sum:1]; 不一…

iview 自定义项求和的方法和错误点

这是iview自定义某几项参数合计的方法,其实是蛮简单的,很多人自定义合计的时候,老是会不知道怎么处理除了需要合计的几项的其他项,其实不需要管,不需要合计的项直接返回空就好了,需要的就在计算的里面做key…

Laravel breeze vs Jetstream

Introduction Laravel在应用程序中提供了几种身份验证选项,为我们的身份验证层提供了一个健壮而现代的脚手架。Laravel入门工具包就是其中之一,它由breeze和jetstream组成。 Laravel Breeze是快速运行程序的绝佳选择,jetstream提供双因素认…

第三章、汇编1

编译选项知识 -Og:这是 GCC 和 Clang 编译器提供的优化选项之一。-Og 的含义是“优化级别为 g”,其中的 “g” 代表了"g优化"。这个选项的作用是启用一些基本的优化,以尽量保持生成的代码易读易调试。它通常会保留变量名和源代码结…