# source **Repository Path**: One_PieceDC/source ## Basic Information - **Project Name**: source - **Description**: 该项目模拟了drf的源码! - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-06-18 - **Last Updated**: 2024-12-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 该项目大体做了什么? ① 对drf CBV的源码进行了完整模拟 ② 对drf 认证组件、权限组件、限流组件、版本组件的源码进行了完整模拟 ③ 实现了Django ORM的原理 注: 1> 解析器组件未模拟,因为压根不用配置它,drf的默认配置就够日常使用啦!没啥需要扩展的. 2> 序列化组件、分页组件、视图组件 有些许复杂,未模拟, 详看博客里相关的源码流程图! --- ### 学会该项目有何作用? 可以快速且充分的了解源码流程! 1> 看到drf项目的代码 能知道底层大体做了什么!!这个很重要. 2> 该项目中使用的类名、变量名等与源码中的都是一样的, 可快速回顾, 并根据项目需求进行扩展! 3> 可以在本项目中快速进行测试, 测试扩展的需求/测试解决bug 看是否达到预期的效果. (*≧ω≦) 当然, 你搭配我的博客食用会更加的得心应手, `https://dchelloworld.cn/pages/3930ff/` --- ### 运行该项目 项目依赖: python3.x 运行项目中的manage.py文件! ```cmd /Users/dengchuan/.venv/bin/python /Users/dengchuan/Desktop/source/manage.py 您可以选择要执行的文件如下: +++++++++++++++++++++++ 1: run1.py - 该文件能成功 模拟 认证-权限-限流 的各种结果. 2: run2.py - 该文件能成功 模拟 版本 的各种结果. 3: run3.py - 该文件能成功 模拟 ORM. +++++++++++++++++++++++ 请输入选项的数字编号>>: 3 Found model: User Found mapping: id ==> Found mapping: name ==> (・_・; 建立数据库连接! 得到构建sql语句的必要条件: ('insert into User (id,name) values (%s,%s);', "[10, 'Tom']") (・_・; 开始执行sql语句! ``` --- ### 关于该项目的结构 ```cmd . ├── cache │ ├── redis.py │ └── redis_cache.txt ├── conf.py ├── django │ └── db │ └── models │ ├── __init__.py │ ├── base.py │ └── field.py ├── do │ ├── run1.py │ ├── run2.py │ └── run3.py ├── drf │ ├── req.py │ ├── thr.py │ ├── versioning.py │ └── views.py ├── ext │ ├── auth.py │ ├── per.py │ └── throttle.py ├── manage.py ├── readme.md └── settings ├── django_settings.py └── drf_settings.py ``` -1- manage.py 是入口文件, 你拿到该项目后, 直接右键运行该文件即可. -2- cache目录 使用文本文件的方式实现了redis最最基本的功能 -3- django目录 模拟了 Django ORM 的原理! -4- do目录 中是用于测试的, 运行manage.py时, 会让我们选择运行do目录下的某个py文件 | 文件 | 作用 | |------------|-------------------| | do/run1.py | 模拟 认证-权限-限流 的各种结果 | | do/run2.py | 模拟 版本 的各种结果. | | do/run3.py | 模拟 ORM. | -5- drf目录就是drf的源码复现; | 文件 | 作用 | |-------------------|------------------------| | drf/req.py | 对Django的request进行的二次封装 | | drf/thr.py | 与drf的限流组件相关 | | drf/versioning.py | 与drf的版本组件相关 | | drf/views.py | 与APIView相关 | -6- ext目录是 认证类、权限类、限流类 相关的编写. | 文件 | 作用 | |-----------------|-----------| | ext/auth.py | 可自己编写的认证类 | | ext/per.py | 可自己编写的权限类 | | ext/throttle.py | 可自己编写的限流类 | -7- settings 目录 + conf.py 变相的实现了 先使用项目里的配置,没有再使用drf的配置. --- ### 项目中与源码有出入的地方 - 关于request请求相关的所有数据: 请求⽅式、当前访问的路由...等. 我仅仅只是用一个类来模拟request! eg: 该类实例化成员 `cls.GET = {}` 就代指 Django `request.GET` 获取url中 ?params的参数. - 如何进行路由匹配的, 本人能力有限, 在该项目中未能涉及, 直接进行的路由匹配后的操作. 即加括号直接执行, `InfoView.as_view()(request, id=2)` - conf.py + settings 文件夹 变相的实现了 先使用项目里的配置,没有再使用drf的配置. conf.py文件的注释中详细阐述了我的心路历程/想法. 详情请翻阅. - drf限流组件的源码中用到了redis数据库,此处我们使用文本文件的方式实现了redis最最基本的功能!! 在cache/redis.py中进行了实现,实现的功能包括: 1> 设置过期时间,数据过期会自动在数据库中进行删除 2> 往redis数据库中设置键值对, 键存在则覆盖、键不存在则新增! 3> 根据键名从redis数据库中获取相应的值, 若没有,可返回自己设置的默认值! - drf版本组件的源码中用到了Django 反向解析的源码reverse, 能力有限, 无法复现reverse的源码. 于是,reverse方法 我直接返回最终结果了. 并不影响整个版本组件的理解! - ORM的原理,该项目中是通过 继承dict+属性访问+元类 实现的 Django中ORM相关的源码中没有那么简单, 说实话我还不知从何入手剖析它. (・_・; PS: 在查找相关资料时, 我发现了一本书《深入理解Django: 框架内幕与实现原理》等后续我再好好学习下. ---