django及DRF流程源码分析

news/2025/2/19 10:12:35
Django执行流程:

1.nginx作为接入层,通过反向代理,监听80端口获取请求连接
2.将请求交给wsgi server
3.wsgi server调用django的wsgi.py 处理请求
4.WSGIHandler的__call__函数就是整个逻辑处理流程
5.WSGIHandler __init__中的加载中间件,对request对象做处理
6.urlpatterns匹配对应视图view处理逻辑
7.中间件处理response
8.返回response

DRF执行流程:

rest-framwork在urlpatterns指定的逻辑层上,增加了对应处理流程(比如请求方法判定,权限鉴定)

1.到url,执行views.TestView.as_view()函数
2.as_view方法是被定义在rest_framework/views.py里面的一个静态方法,所以可以通过类名直接调用
3.父类的as_view方法是定义在django/views/generic/base.py里面的View类中的方法。在这个方法中最终会执行cls.dispatch,在第一步中我们知道cls是<class ‘app01.views.TestView’>
4.dispatch是定义在TestView继承的父类APIView(rest_framework/views.py)里面的方法。在这个方法里面,首先通过 request = self.initialize_request(request, *args, **kwargs)这条语句重新封装了request对象
5.initialize_request是APIView类里面的一个方法,重新封装了request对象,增加了一些属性信息
return Request(
request,
parsers=self.get_parsers(),
authenticators=self.get_authenticators(),
negotiator=self.get_content_negotiator(),
parser_context=parser_context
)
1.认证信息:主要通过APIView类中的get_authenticators(rest_framework/views.py)方法获取,这个方法会返回一个所有认证对象的列表[auth() for auth in self.Authentication_classes]
在全局定义的authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
2.在rest_framework/authentication.py中定义了几种认证类型

class BaseAuthentication(object) 基本认证类

class BasicAuthentication(BaseAuthentication) 基础认证类

class SessionAuthentication(BaseAuthentication) 会话认证类

class TokenAuthentication(BaseAuthentication) 令牌认证类

class RemoteAuthentication(BaseAuthentication) 远程用户认证类

一般情况我们需要自定义认证类,也可以使用django-oauth-toolkit组件进行认证。

6.dispatch中的initialize_request方法执行完成之后,还有执行一个重要方法是self.initial(request,
*args, **kwargs),这个方法也是APIView类里的。在这个方法里面初始化被重新封装的request对象。实现以下功能
1.版本处理(version, scheme = self.determine_version(request, *args, **kwargs) request.version, request.versioning_scheme = version, scheme)

2.用户认证(self.perform_authentication(request))

3.权限(self.check_permissions(request)

4.访问频率限制 (self.check_throttles(request))

认证:
1.执行APIView里面的perform_authentication方法,该方法返回request.user,则会调用<rest_framework.request.Request object at 0x10e80deb8>里面的user方法。在user方法里面最终调用了Request类里面的_authenticate方法
2.执行rest_framework.request.Request类中的_authenticate方法,这个方法会遍历认证类(遍历认证对象列表,并执行里面的authenticate方法,获取认证信息,并根据认证结果给self.user, self.auth赋值。由于user,和auth都有property属性,
所以给赋值的时候先在先执行setter方法

7.dispatch中的initial方法执行完之后,会继续判断request.method并执行method相应的method.

文章来源:https://blog.csdn.net/unicorn_mitnick/article/details/134517036
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.niftyadmin.cn/n/5198872.html

相关文章

axios的原理及实现一个简易版axios

面试官&#xff1a;你了解axios的原理吗&#xff1f;有看过它的源码吗&#xff1f; 一、axios的使用 关于axios的基本使用&#xff0c;上篇文章已经有所涉及&#xff0c;这里再稍微回顾下&#xff1a; 发送请求 import axios from axios;axios(config) // 直接传入配置 axio…

【C++】使用std::vector()函数实现矩阵的加、减、点乘、点除等运算

本文通过vector&#xff08;&#xff09;函数表示矩阵的形式&#xff0c;对 加、减、点乘、点除等运算进行编码和运行&#xff0c;相应结果如下文所述。 #include <iostream> #include <vector>using namespace std;// 矩阵加法 vector<vector<int>> …

20231116模拟赛题解

T1 最大值和最小值的乘积之和 由于要同时搞最大值和最小值&#xff0c;自然想到枚举其中一个。 于是从小到大枚举每一个数作为最小值&#xff0c;然后统计最大值之和&#xff0c;相乘后全部相加即为答案。 怎么求最大值之和呢&#xff1f;可以打个表帮助思考&#xff08;找规…

表内容的操作(增删查改)【MySQL】

文章目录 表的 CRUDCreate&#xff08;增加&#xff09;插入记录插入冲突则更新记录替换记录 Retrieve&#xff08;查找&#xff09;查找记录指定表达式的别名为结果去重WHERE 子句运算符条件查询区间查询模糊查询空值查询 对结果排序筛选分页结果 Update&#xff08;修改&…

Excel自定义函数提取超链接

通过自定义函数的方法&#xff0c;批量提取超链接 首选开启开发工具选项 文件-选项-自定义功能区-勾选开发工具选项-确认 AltF11或者直接点击跳转到开发工具-Visual Basic 在左上方VBA project空白处右键点击空白区域-插入-模块 在弹出的窗口中输入以下命令定义GetURL函数 F…

linux rsyslog综合实战1

本次我们通过rsyslog服务将A节点服务器上的单个日志(Path:/var/log/245-1.log)实时同步到B节点服务器目录下(Path:/opt/rsyslog/245) 1.rsyslog架构 2.环境信息 环境信息 HostnameIpAddressOS versionModuleNotersyslog1192.168.10.245CentOS Linux release 7.9.2009 (Core)rs…

Oracle Data Redaction和Oracle Data Pump

本实验的使用环境基于之前的博客&#xff1a;一个简单的Oracle Redaction实验 本实验参考文档为15.14 Oracle Data Redaction and Oracle Data Pump 先创建directory并赋权&#xff1a; -- connect to database or pluggable database alter session set containerorclpdb1;…

Android 电量优化概览

目录 一、三大耗电模块 二、显示 2.1 Overdraw简介 2.2 Overdraw检测 2.3 UI优化优化 三、网络 3.1 移动网络 3.2 Wi-Fi 3.3 网络优化 四、CPU 4.1 变频 4.2 CPU优化 4.2.1 计算优化 4.2.2 避免WakeLock使用不当 4.2.3 避免Alarm Manager使用不当 4.2.4 使用Jo…