社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  问与答

[精华] 我为什么用django 写给那些迷茫在python各种web框架中的人

cdxfish • 9 年前 • 21626 次点击  

首先说明, 本文纯属个人的一些见解,如果有不恰当或有失公允的地方,希望大家多多谅解。 本人业余开发爱好者一枚。之所以不用程序员,是因为害怕自己的水平玷污了程序员这个称号。在我的眼里,程序员是一些兼备科学家和艺术家气质的人。所以本人屌丝一枚,只好自称爱好者。

学习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种形式,具体我不在这里一一列出。只简单说说他的意义。

  1. 可以扩充django模板的现有语法。例如switch case 等等,没有做不到,只有想不到。
  2. 为模板中加入函数功能。
  3. 把不同模板中的共有片段抽象出来,进行封装。好处是大大减少了代码量, 注意我这里说的复用既包

括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玩家。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/1068
 
21626 次点击  
文章 [ 6 ]  |  最新文章 8 年前