在那些优雅、易用、丰富的API背后,总是隐藏着不为人知的密术,好奇的技术人员也总想一探究竟。
由来
所有在用Django的同学都能体会到TA的强大,也能感受到TA的复杂。当能够通过Django完成简单或者复杂的业务功能之后,我们不可避免的想要了解TA更多。如何实现url router,如何实现的ORM,如何实现的debug模式的autoreload。技术上最有趣的事儿莫过如此,好奇,你就有机会一探究竟。源码随时为你敞开。
在工作的前几年,我们的小伙伴也产生过这样的好奇。问出这样的问题:“如何更好的阅读Django源码”。结果是被我们喷回去读Tornado源码。相对来说Django的代码中会充斥大量的业务代码,就技术氛围(鬼知道源代码里能不能读出技术氛围~~)而言,Tornado更好一些。But,如果你要长期使用Django还是阅读Django代码吧(这是后来我才想明白的事)。研究工具的意义毕竟是更好的解决问题。
前几天在the5fire博客的也有读者(@杨学光)问了一样的问题:如何入手研究Django源码。所以你看,岁岁年年花相似,年年岁岁人不同。这篇文章就写写如何阅读Django源代码。
在此之前,建议先阅读我之前的一篇文章《Python工程师进阶之道》,就像我里面所说的:
好了,the5fire来总结下理论部分:从熟悉的地方中找到陌生的东西,然后搞懂,慢慢往外延伸,可能会比较吃力,但是哪有好走的捷径?
不知道 @杨学光 同学是否理解了。
如何阅读Django源代码
先唠叨几句阅读源码的方式,其实不止Django源代码,the5fire个人总结阅源代码的姿势也就那么几个:
- 业务需要,遇到坑了,文档没找到,只能读代码,比如之前the5fire因为一个小问题去翻了一遍nginx的源码。带着问题去看,会更认真,收获的会更多。就像《如何阅读一本书》里面提到的一样。
- 用着用着就开始好奇Django的CONN_MAX_AGE是怎么实现的,已经熟悉了各种API接口,所以想一探究竟。
- 纯学习,学了一段时间Python了,想去找个源码看看,看看自己能不能看懂,还有哪些知识盲点。或者另外一种更高的境界是去学习下优秀框架的设计思想,如何对数据进行封装,如何使用各种魔法函数。
- 找工作,简历上只写我熟悉Django和Tornado,显然不如写我阅读了Django和Tornado的源码,收获很多,之类的话有吸引力。
- more and more —— 欢迎补充。
那么书归正传。如果你不熟悉Django,就妄想去读TA的源代码的话,那你学习到的只能是一些Python的技巧,比如闭包的使用,各种魔法方法的使用,线程的使用,弱引用的使用等等。对于理解Django是如何支撑起完美主义者的快速开发情结是没有帮助的。
所以第一步是用TA,先熟悉一块领域,比如说url router,然后再顺藤摸瓜。以此类推,熟悉了Model,Queryset,知道Queryset是惰性的之后,再去看TA是怎么做到的。继续摸瓜。
再此之后,去看看Django的文档,每个模块或者说每一层都已经划分的很清晰了,你需要自己把理解的东西对应到具体的那一层上去。比如说你看了Model的Queryset,然后可以对应到Model层;然后你看了Class Base Views部分的封装逻辑,然后你可以对应到View层,Class Base Views跟Model是怎么关联的,这样就可以连起来。以此类推。最终其实能够Get到的是,一个请求通过WSGI协议转到Django中来之后,每一层的处理逻辑是怎么样的。
几个入手点
下篇再写吧,没时间了,快上车~~~~~~~~~
- from the5fire.com微信公众号:Python程序员杂谈