
全书共分为8 章,分别是Django 源码的前置知识、 Django 命令原理解析、Django 内置的ORM框架、Django 内置的模板系统、解读Django 核心模块的源码、Django 的视图层、Django 的中间件原理和解读Django 中的辅助代码。本书展示了剖析Django 框架的完整过程,这种剖析方式同样适用于其他框架,如Flask、Ansible 和Scrapy 等。
前言 随着深度学习的流行,Python 逐渐走到了互联网的幕前,它在多个领域使用广泛:机器学习、数据分析、Web 服务、自动化运维,等等。Django 是Python 在Web 框架中的代表作品。学习Django源码,一方面,能从中学到许多Python 的高级用法;另一方面,能深度掌握Django 框架,并能随时对其进行定制和改造,这对一个Python 程序员的成长至关重要。此外,在Django 源码中,很多函数与类均可在简单改造后直接加入开发人员手头的代码库中。 撰写本书的主要原因有两个:一是想将笔者剖析Django 源码的过程记录下来,二是想给一些Django 初学者开启一个新的进阶方向。 Django 源码十分适合初学者学习,因为Python 源码与C++源码相比难度要低许多,而且调试方便,读者可以随时打印结果进行验证。以Django 源码为入口切入开源世界,对Python 爱好者而言,再合适不过了。 本书特色 本书的主要特色有: 对Django 的源码进行了合理选择,并不会盲目追求最新与最小版本,而是从适合的角度进行考虑。 对Django 的源码进行了合理归类与总结,并按照归类结果依次解读相关源码,循序渐进。 有对Django 源码细节的丰富解读,直接使用实战的方式帮助读者理解相关类与方法。 对Django 源码的解读均采用先上手并提问的方式,然后会带着问题去跟踪源码,最后阅读完相关模块源码后会统一对前面提出的问题进行解答。这很符合初学者的阅读习惯,使得阅读本书十分顺畅。 本书内容 全书共分为8 章,分别是Django 源码的前置知识、 Django 命令原理解析、Django 内置的ORM框架、Django 内置的模板系统、解读Django 核心模块的源码、Django 的视图层、Django 的中间件原理和解读Django 中的辅助代码。本书展示了剖析Django 框架的完整过程,这种剖析方式同样适用于其他框架,如Flask、Ansible 和Scrapy 等。 本书对Django 源码进行了全面解读,针对很多源码细节使用了大量的演示实例,以便读者更好地理解Django 框架的核心源码。本书给读者提供了一个解读完整开源项目的案例,读者在学完本书后,可以将本书剖析Django 源码的方式应用于其他Python 开源项目,收获良好的学习效果。 本书的思维导图如下所示。 读者对象 想要学习本书的内容,领会其中的分析思路,读者需要具备一定的Python 基础,同时要有坚持学习的信念,本书适合以下读者阅读: 具有一定Python 基础的开发人员; 希望熟练使用Django 框架进行Web 开发,而且想深入了解Django 核心源码的后端开发人员; 渴望进入开源世界,探索一个顶级开源项目全貌的初、中级程序员; 高等院校的老师和学生; 相关培训机构的学员。 配书资源获取方式 本书涉及的源码需要读者自行下载。在博文视点网站(http://www.broadview.com.cn/)搜索本书,单击进入本书页面,即可在本书页面上找到下载链接。此外,可以通过微信搜索“源码探索之旅”公众号并关注,笔者会在上面对读者的一些疑惑进行文字或视频解答。 致谢一 在本书的写作过程中,我充满着感激之情。 感谢我的家人!感谢父母和姐姐给我的鼓励与支持,没有他们就没有我的今天,我也不会有机会接触计算机行业。 感谢我的女朋友黄宝宝,她花费了休息时间帮我修改书稿中的不当语句和错别字,给予我充分的时间专注于核心内容。 感谢天翼云科技有限公司的领导黄润怀和我的直接上级领导林洁琬组长,他们给我们组创造了一个难得的机会,让我们能全身心地投入分布式存储领域中。正是这次机会,让我在自动化运维领域自由探索。由于工作的需要,我接触了许多基于Python 开发的开源项目,也逐渐爱上探索开源工具内部的源码。 感谢同一届进入公司的同事:商金辉、李浩、全树强和张一飞,每天吃完晚饭在路上胡吹海侃的日子,真是令人怀恋啊! 感谢媒体存储小分队的黄鹄、陈涛、毛廷鸿、谭伟杰、吴文峰、杨佑,他们丰富的互联网经验给了我很多帮助,也让本书的写作比预期顺利很多。 感谢本书的编辑安娜,她的耐心和细心促成了本书的快速交付;还要感谢其他为本书的出版提供过帮助的编辑和朋友!没有他们的大力支持,本书也很难与读者见面。 沈 聪 致谢二 我们能顺利完成本书既离不开自己的付出和努力,也离不开家人和同事们的大力支持。他们的支持让我在编写本书的道路上走得更加顺利,我要向他们表示最真挚的谢意。 首先,感谢我的妻子对我的关心和支持。在技术探索和创作的历程中,她的关心让我充满了前进的动力,这也让我能够走得更远。 其次,感谢本书的合著者沈聪先生。他喜好钻研,技术能力强,我们在工作中多次合作交流,让我受益匪浅。本书的创作也凝聚了他的心血和精力。 最后,感谢我的领导林洁琬组长和其他同事。在林洁琬组长的带领下,我们项目组的业务和技术都突飞猛进,也让我有了更多的机会对Django 框架进行实践和探索。项目组的资深运维工程师陈涛、毛廷鸿、谭伟杰、杨佑等对我们基于Django 框架的项目开发提供了宝贵的建议和技术支持。 全树强 技术支持 Django 项目如今依旧频繁迭代着,在本书正式出版时,书中介绍的Django 版本距离最新版本可能会有较大差距。尽管版本可能差距较大,但笔者发现Django 的核心源码及相关逻辑一直未有大的改变,读者可以放心阅读。笔者完成本书所需的主要素材只有Django 源码,许多Django 术语(比如核心模块、中间件等)都是直接翻译英文注释而来,可能会有不当之处,加之笔者水平和精力所限,书中可能存在一些疏漏与错误,敬请各位前辈、同行、读者不吝指正。如果在阅读本书时有疑问,可以发送电子邮件到2894577759@qq.com,笔者当尽力解答相关疑问,与读者共同成长与进步。
第1 章 Django 源码的前置知识 ............................................................................................... 1 1.1 在学习Django 源码前,该做什么 ............................................................................. 1 1.1.1 Django 的版本选择 ...................................................................................... 1 1.1.2 Django 源码学习基础 .................................................................................. 2 1.2 搭建Django 的调试环境和测试环境 .......................................................................... 3 1.2.1 调试django-admin 命令 .................................................................................. 3 1.2.2 调试manage.py 命令 ....................................................................................... 8 1.2.3 调试框架源码 ................................................................................................. 11 1.2.4 搭建Django 的测试环境 ............................................................................... 15 1.3 学习Django 源码的建议 ........................................................................................... 17 1.4 小结 ............................................................................................................................. 18 第2 章 Django 命令原理解析 ...................................................................................... 19 2.1 基础方法介绍 ............................................................................................................. 19 2.1.1 find_commands()函数 .................................................................................... 19 2.1.2 load_command_class()函数 ............................................................................ 20 2.1.3 get_commands()函数 ...................................................................................... 20 2.1.4 call_command()函数 ...................................................................................... 21 2.2 startproject 命令的实现原理 ...................................................................................... 24 2.3 shell 命令的实现原理 ................................................................................................. 33 2.4 makemigrations 命令的实现原理 .............................................................................. 45 2.4.1 makemigrations 命令的基本操作示例 ........................................................ 45 2.4.2 迁移相关的基础类与方法 ......................................................................... 47 2.4.3 追踪makemigrations 命令 .......................................................................... 69 2.5 migrate 命令的实现原理 ............................................................................................ 78 2.6 小结 ............................................................................................................................. 90 第3 章 Django 内置的ORM 框架 ................................................................................ 91 3.1 读取Django 项目的配置信息 ................................................................................... 91 3.1.1 Settings 类 .................................................................................................. 92 3.1.2 LazySettings 类 ........................................................................................... 94 3.2 ORM 框架的底层核心 ............................................................................................... 97 3.2.1 mysqlclient 模块中的常用方法 .................................................................. 97 3.2.2 ORM 框架的源码解析 ............................................................................... 98 3.2.3 DatabaseWrapper 类的实战案例 .............................................................. 108 3.3 Django 中数据库操作背后的原理........................................................................... 116 3.3.1 在Django 中执行原生SQL 语句 ............................................................. 117 3.3.2 ORM 框架的基本操作 ............................................................................. 118 3.3.3 答疑解惑 .................................................................................................. 160 3.3.4 ORM 框架的聚合操作 ............................................................................. 162 3.4 ORM 框架的部分源码解读 ..................................................................................... 176 3.5 小结 ........................................................................................................................... 205 第4 章 Django 内置的模板系统 ................................................................................. 206 4.1 Django 内置的模板语法 .......................................................................................... 206 4.1.1 for 标签 .................................................................................................... 207 4.1.2 if 标签 ...................................................................................................... 211 4.1.3 csrf_token 标签 ......................................................................................... 212 4.1.4 with 标签 .................................................................................................. 212 4.1.5 cycle 标签 ................................................................................................. 213 4.1.6 include 标签 ............................................................................................. 214 4.1.7 过滤器标签 .............................................................................................. 215 4.2 Django 内置模板引擎源码解读 .............................................................................. 216 4.2.1 get_template()方法的源码解析 ................................................................ 216 4.2.2 _engine_list()方法的源码解析.................................................................. 216 4.2.3 EngineHandler 类的源码解析 .................................................................. 217 4.2.4 DjangoTemplates 类的源码解析 ............................................................... 221 4.3 答疑解惑 ................................................................................................................... 283 4.4 Jinja2 模块封装过程解析 ......................................................................................... 299 4.5 小结 ........................................................................................................................... 303 第5 章 解读Django 核心模块的源码 ........................................................................ 304 5.1 core 目录源码一览 ................................................................................................... 304 5.2 请求处理 ................................................................................................................... 305 5.3 缓存模块 ................................................................................................................... 316 5.4 检查模块 ................................................................................................................... 330 5.4.1 messages.py 文件的源码解析 ................................................................... 330 5.4.2 registry.py 文件的源码解析 ...................................................................... 333 5.5 序列化 ....................................................................................................................... 348 5.5.1 serialize()方法的源码解析 ....................................................................... 349 5.5.2 JSON 序列化器的底层逻辑 ..................................................................... 359 5.5.3 简单分析Python 序列化器的输出结果 ................................................... 366 5.6 文件模块 ................................................................................................................... 367 5.6.1 uploadedfile.py 文件 ................................................................................. 367 5.6.2 images.py 文件 ......................................................................................... 374 5.6.3 locks.py 文件 ............................................................................................ 376 5.6.4 temp.py 文件 ............................................................................................ 378 5.6.5 move.py 文件 ........................................................................................... 379 5.6.6 storage.py 文件 ......................................................................................... 381 5.6.7 uploadhandler.py 文件 .............................................................................. 384 5.7 发送邮件 ................................................................................................................... 393 5.8 小结 ........................................................................................................................... 405 第6 章 Django 的视图层 ........................................................................................... 406 6.1 视图层实战 ............................................................................................................... 406 6.1.1 实验1:Django 中的“hello, world” ....................................................... 406 6.1.2 实验2:Django 中的视图类 .................................................................... 409 6.1.3 实验3:Django 中的请求传参 ................................................................ 410 6.1.4 实验4:Django 中的文件上传演示 ........................................................ 414 6.1.5 实验5:在Django 中操作Session .......................................................... 417 6.2 请求与响应 ............................................................................................................... 419 6.2.1 HttpRequest 类的源码 .............................................................................. 429 6.2.2 HttpResponse 类的源码 ............................................................................ 433 6.2.3 HttpRequest 类和HttpResponseBase 类的操作示例 ................................ 440 6.3 视图层核心源码解读 ............................................................................................... 444 6.3.1 HTTP 请求路径的匹配过程 ..................................................................... 449 6.3.2 答疑解惑 .................................................................................................. 457 6.4 视图类与Mixin 类 ................................................................................................... 462 6.4.1 Mixin 类的源码解析 ................................................................................ 462 6.4.2 TemplateView 类的源码解析 ................................................................... 463 6.4.3 RedirectView 类的源码解析 ..................................................................... 467 6.4.4 DetailView 类和ListView 类的源码解析 ................................................. 469 6.4.5 MultipleObjectMixin 类的源码解析 ......................................................... 479 6.4.6 Paginator 类的源码解析 ........................................................................... 482 6.5 追踪Session 相关的源码 ......................................................................................... 486 6.5.1 Session 相关的配置 .................................................................................. 486 6.5.2 Session 的存储引擎 .................................................................................. 495 6.5.3 SessionBase 类中的代码文件 ................................................................... 502 6.6 答疑解惑 ................................................................................................................... 507 6.7 小结 ........................................................................................................................... 517 第7 章 Django 的中间件原理 .................................................................................... 518 7.1 配置中间件 ............................................................................................................... 518 7.2 加载中间件 ............................................................................................................... 519 7.3 中间件的处理流程 ................................................................................................... 521 7.3.1 中间件的请求处理流程 ........................................................................... 521 7.3.2 中间件的响应处理流程 ........................................................................... 525 7.3.3 中间件的其他钩子方法 ........................................................................... 526 7.4 常用的中间件 ........................................................................................................... 528 7.4.1 Django 内置的中间件类 .......................................................................... 528 7.4.2 CsrfViewMiddleware 中间件 .................................................................... 529 7.5 自定义中间件 ........................................................................................................... 536 7.6 小结 ........................................................................................................................... 541 第8 章 解读Django 中的辅助代码 ............................................................................ 542 8.1 自动重载 ................................................................................................................... 542 8.2 日志配置 ................................................................................................................... 552 8.2.1 日志配置实战 .......................................................................................... 553 8.2.2 日志配置的源码追踪 ............................................................................... 555 8.3 时间解析 ................................................................................................................... 559 8.3.1 datetime_safe.py 文件 ............................................................................... 559 8.3.2 dateformat.py 文件 ................................................................................... 562 8.3.3 dateparse.py 文件 ...................................................................................... 565 8.4 文本处理 ................................................................................................................... 569 8.4.1 text.py 文件中的capfirst()函数和wrap()函数 .......................................... 570 8.4.2 html.py 文件中的代码 .............................................................................. 575 8.5 其他的类与函数 ....................................................................................................... 582 8.6 小结 ........................................................................................................................... 589