前言 - 开篇词
很高兴能有这一系列的内容,可以分享自己对于Django源码的认识,交流源码学习的心得。今天正式开始。下面先来自我介绍一下。
作者介绍
网名:the5fire 博客:https://www.the5fire.com ,Python Web开发工程师,到今年为止,已经用了8年Python了。主要熟悉框架为Django和Tornado,熟悉Django的大部分模块,以及可以熟练的对各种模块进行定制化开发,包括Admin。Tornado开发的项目承载过亿级访问量,对Tornado的特性有比较深的理解。
刨源码经历
既然是Django源码解析的课程,那么就简单介绍下我刨各种项目源码的经历吧。
1. Tomcat源码
第一次意识到学习框架源码的重要性是源于此,在2011年,那时是在做Java开发,在别人的推荐下看了《How Tomcat Works》这本书,虽然并没有学习完,但依然让我在使用Java开发Web系统时有了更通透的感觉,至少是知道了我所编写的业务代码下的框架是如何运作的。
另外更重要的一点是,让我意识到,有很多优秀的开源项目,其实是可以直接去学习其源码的。再次之前因为是在使用VB.NET和C#开发项目,所以不太有意识。
可以说第一次阅读源码的经历让我打开了新世界的大门。
2. Django 和 Tornado
看Django的源码是纯属工作需要,当时我们基于Django的Admin系统进行了很多定制开发,而Django的Admin部分文档偏偏很少,因此大部分的需求都需要去查看Django Admin的源码来进行处理。
这么做带来的好处就是遇到问题是不依赖文档,直接通过查看源码来确认有哪些API可以使用,可以用来hook,或者patch。
在前面的课程中我也介绍过,Django的Admin用到了Django提供的各个模块:Model,Form,Widget,QuerySet等,因此通过这个机会熟悉了Django常用的模块。
看Tornado源码是源于我们认为相对于Django庞杂的业务代码来说,Tornado的代码的技术含量更高。有一段时间团队成员都在私下学习Tornado的源码,对于要承载高流量的业务来说,完全掌握所使用的框架是非常有必要的。
从读源码的体验上来说,Django的源码纷繁复杂,各种模块之间的依赖需要阅读大量相关代码才能捋的清楚。而Tornado的代码是,晦涩难懂,因为它基于事件模型封装出来的协程实现方案是非常绕的。两者是不同的逻辑,可以学习到不同的内容。
3. Nginx
阅读Nginx源码是为了解决当时遇到的一个问题:《Nginx主动监测模块upstream check误用导致的502--no live upsteams》。
从解决的问题的方向上来说,阅读Nginx源码并不是最有效的方式,毕竟是C的代码,没有那么熟悉。但当时没有想到nginx_upstream_check_module模块的默认值为default_down=true,以为是我们的Nginx配置有问题。所以花了些时间调试并阅读了Nginx部分源码,从根上找到了问题所在。
从技术储备上来说,也是有些收获,虽然现在回忆起来有很多细节都忘了,但再次阅读源码应该问题不大。关键在于熟悉了Nginx启动、重启、模块加载以及处理请求的流程。
4. Python源码
比较早的时候跟着《Python源码刨析》的书看过几章,并不是很深入,这里不再多说。
看源码能得到什么
看源码跟看书的目的其实是一样的,都是为了更多的掌握一个工具使用。很多时候我们能够熟练使用一个工具,除了使用时间比较长导致的熟能生巧外,还有另外一个原因是我们对工具的实现原理比较清晰。
只有这样我们才对使用工具所能达到的结果有一个比较明确的把握。
其实从上面我看源码的介绍也能体会到,我们每天都在写代码,我们的代码每天都在为很多人提供服务,我们有必要了解其运行细节。了解细节除了让我们能够更好的认识代码世界之外,还能提升我们开发项目以及解决问题的能力,比如二次开发,深度定制之类的业务需求。
Django源码解析期望传递的信息
说到具体的Django源码解析期望传递的信息,我个人的看法是这样,当我们在学习和使用Django时,经常会遇到各种各样的问题,比如性能,比如代码组织结构,比如API的使用等。
很多问题的出现都是因为对框架的不熟悉导致,有些是因为用的少,有些是因为不理解Django的实现逻辑。
所以这个专栏的目的是,让大家熟悉Django源码的常用模块,了解它在实际业务开发时的作用。只有当你对一个工具的运作原理有了更深入的认识时,用起来才能得心应手。
另外一个目的是我们一起学习Django源码的设计,从工程的角度来看,Django源码就是一个很好的工程,它能广泛被大家所用,肯定是基于其他合理的设计以及对外提供的功能接口。
所以我们也可以通过学习Django源码来学习如何设计/组织我们的项目。
内容核心概念
原则:从实际用处着手,逐步深入
整体思路:从认识框架、安装框架、使用框架开发项目、到项目最终上线被用户访问的思路来分析源码。
目标读者:
- 能够使用Django开发项目,想要更深入的了解Django内部原理
- 已经开始尝试翻源码,希望找个人一起交流
- 想要通过学习Django源码,写出更好代码
注意事项:
本套视频的更新频率为周更,每次更新两三节内容(每节控制在30分钟左右)
使用的Django版本声明
Django目前为止的最新版代码为Django 2.0.6,我们会以此版本为主来进行学习。注释版的代码会公开在我的GitHub上:https://github.com/the5fire/django-inside/tree/2.0.6
学习建议
我会尽量安装由浅入深的方式来介绍Django源码,但还是建议读者最好能够熟练使用Django来开发项目,有一定的使用经验。
虽然你们看到的内容是一样的,但对于已经可以熟练使用Django的人显然能获取更多的信息。毕竟只有你熟悉了他的用法,你才知道它这么做的原因。
所以对于刚开始学习Django的同学,可以考虑《Django企业开发实战-视频版》:
扮演角色
不同于《Django企业开发实战-视频版》中教练的角色,在《Django源码解析》中扮演的更多是一个分享者的角色。因为这不能算是一个教你怎么用一个工具构建某个系统的教程,这只是分享我对Django源码的认识,基于不同的经历和背景,每个人分享出来的内容是完全不同的。
因此补充一个学习建议就是:根据自己日常的工作和使用需求,尝试自己一点一点的翻看源码,然后共同交流。
好了,让我们正式开始吧。
PS: 已经更新了两节内容。
- from the5fire.com微信公众号:Python程序员杂谈