首先说明, 本文纯属个人的一些见解,如果有不恰当或有失公允的地方,希望大家多多谅解。
本人业余开发爱好者一枚。之所以不用程序员,是因为害怕自己的水平玷污了程序员这个称号。在我的眼里,程序员是一些兼备科学家和艺术家气质的人。所以本人屌丝一枚,只好自称爱好者。
学习Django之前,本人也鼓捣过flask和tornado,但是因为水平有限。如果什么都自己写的话有点太难为自己了。而且本人略有洁癖,无法忍受在不同工程中把相同的代码写上一遍又一遍。 几经思量,最后把目光落在了django上。
接触django是1.5发版的时候。 第一感觉就是这东西太大了。真不知道从哪里学起。还好django的文档做的是非常的到位。只要你想学,我敢保证,90%的情况下你都能从文档里面找到你想要的东西。与之相比。 其他框架的文档真的有点相形见绌。
你只有阅读完他的所有文档之后,才会有自己的感慨。 我知道一些小框架的文档确实非常有吸引力,因为不需要花太多的阅读时间,上手飞快, 在这个速食的年代里,这真的是几乎无法抵御的诱惑。 但是只有你通盘阅读了django的文档之后,你才会知道,你究竟学到了什么。
记得网上有人这么说过,赞同django哲学的人会爱不释手, 不赞同django哲学的人会痛不欲生。我估计我是前者。 Django里面有些设计在我看来确实非常好,比如:
工程结构,各个子模块都是独立的,推荐大家使用pycharm,用他本身的django工程模板就可以了。 Flask里面我们可以用蓝图来实现相同的目的。但是从易用性来讲的话,flask确实还有待改进。 子模块独立可以让我们在自己的工程中快速引入其他人的工作成果。之所以拿flask来做对比,不是想说哪个框架好。而是本人最近在重新学习flask。Flask设计的短小精悍,粘合了jinja2 和Werkzeug。 里面有很多值得学习的地方比如LocalProxy。其实flask的很多扩展都是从django借鉴而来。随着你工程量的增加,我们只是在拼凑属于自己的django。但是从代码质量上来说,四个字“良莠不齐”。
这里说一句,如果小伙伴们认为只看flask那几页文档就能开发网站了,我奉劝一句,您就别做梦了,如果你不看jinja2 和werkzeug的文档,不去研究werkzeug的内部机制,你的项目出了问题,你除了满世界发帖子问,永远你都不会知道问题出在哪里。
再来说说Django的模板系统。Django的模板是被多数人诟病的,很多人批评他语法生硬,性能差。 确实,某些方面我有同感。 比如语法不美丽。 和Jinja2 相比,语法确实略显生硬,形式上更贴近java里面的JSTL。 但是如果我们只是单纯的关注语法,对django的模板而言我认为是非常不客观的。我个人的观点,django模板的强大之处在于其templatetags。 如果你不会开发自己的templatetags, 就别说你会用这套模板。
Templatetags 有3种形式,具体我不在这里一一列出。只简单说说他的意义。
- 可以扩充django模板的现有语法。例如switch case 等等,没有做不到,只有想不到。
- 为模板中加入函数功能。
- 把不同模板中的共有片段抽象出来,进行封装。好处是大大减少了代码量, 注意我这里说的复用既包
括html层也包括sql等业务逻辑层。 而Jinja2 里面只能通过宏来实现html的复用。
好吧,终于到了不能不面对的性能问题了。对于很多人来说这是硬伤。不知道出于何种原因django1.8 也开始支持jinja2了。但是说到性能之前,想请各位小伙伴注意下,你的项目的访问量究竟到了纠结性能的高度没有。另外,貌似我们都忘记了有一种东西叫做cache。 Django里面的各种cache应该可以解决我们常见的问题了。这里插一句,那些天天鼓吹jinja2 性能的朋友,为啥你不直接用mako呢?
接下来说说django的Model。这块是数据库的orm的核心部分。小弟才疏学浅。确实没有仔细研究源码。但是从使用的经验上看。大多数的sql还是可以直接用orm实现的。 极特殊的情况下,可以用raw sql。不过如果你有注意到Annotate & Aggregate 那么相信你的问题里面又有相当一部分可以用orm来解决了。
实话实说,这里确实是我用django最纠结的地方。Orm确实比sqlalchemy简单。我会经常幻想,如果django能原生态支持sqlalchemy 那是一件多么美好的事儿啊……..
行了,一句话,应付常用的应用场景。Django的orm足够了。
因为时间有限,我打算选择modelform做这篇文章的结尾,关于django的话题还有太多太多。 ModelForm 是django里面设计很有意思的一个地方,因为一不小心,我们就会把他当成form或者model。相信大家都对django里面自带的那个admin印象深刻吧? 特别是对我们这种懒人来说,简直就是最大的福利。 这个admin背后的功臣就是modelform。 如果我们用orm创建了一个数据库对象。那么我们甚至可以用很少的几行代码,就可以直接用modelform把数据展示到前台,并进行编辑。感兴趣的同学可以直接看admin的源码。
Django就好像一座宝藏。 url,form,modelform,Middleware,templatetags,model,command, ClassView太多太多的理由让我继续学习和使用django。 在python的其他框架里,我们时常都会看到他们的影子。选择django,是选择一种方式。学习Django是学习一种哲学。
没有一种框架可以包治百病,只有是否合适自己,是否合适项目。 如果你已经把django玩的很精通了,在学习其他框架的时候,往往可以事半功倍,相互借鉴。
对于那些还不知道应该选择哪个框架开始学习的同学真心的说一句,django是个不错的开始。最后附上小弟自制玩具一枚www.whyfine.net,献给那些正在努力走在梦想路上的人。 希望能结实更多django玩家。