the5fire

关注Python、Django、Vim、Linux、Web开发、团队管理和互联网--Life is short, we need Python.


如何阅读Django源代码-上篇(the5fire版)

作者:the5fire | 标签:       | 发布:2017-05-25 7:56 a.m. | 阅读量: 13345, 12278

在那些优雅、易用、丰富的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
----EOF-----

微信公众号:Python程序员杂谈


其他分类: