锁定老帖子 主题:偶对django的rant
精华帖 (4) :: 良好帖 (9) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-04
本文乃我半夜不爽的咆哮之作。django的忠实fans可无视本文。
久闻django大名,号称与ROR齐名。刚才就开始看hideto的《翻译www.djangobook.com系列》。然而一边看一边摇头,才看到第四章模板当中,我就看不下去了。 django的设计实在是太恶心了! 就我看的这几章已经暴露出的问题: 1. url要用正则匹配,这是很差的设计,完全罔顾url的最常见的匹配习惯就是按照 / 来划分的事实。诚然正则具有最大的灵活性,但是这种所谓灵活性在url匹配这个事例中完全是负担!仅就这一点设计而言,django就不配称快速开发框架。因为光光一个充斥^$好多括号的配置文件已经足够把人折腾死了。 2. 最简单的几个配置文件都要import。。。view里的request居然也要import。难道是python的限制? 3. 使用template要指定,难道没有默认约定吗? 3. 模板太奇怪。首先是{%,为什么不用<%?php,asp,jsp都用,django偏偏要独树一帜?那么独树一帜(比如velocity用#,比如xquery直接用 { } ),你干脆别用那可恶的%符号啊,{和%的组合莫名其妙不伦不类。 4. {%如果说纯粹是个人喜好问题,那么模板的功能限制就是实在的大问题。诚然,我赞同对模板加以限制的设计哲学。但是django的平衡点实在混乱。 只支持无参方法调用,但又加了silent_variable_failure和alters_data。事实是:方法是否可用于view,与有否参数无关(因为过滤器其实就是变相方法)。你要么就什么方法都不支持(像jsp一样),所以silent_variable_failure和alters_data这两个属性根本就是为了错误的设计决策打的patch! 不许if混用and / or,但是要求if嵌套?当模板作者都是白痴啊! 不许写 if a = b,偏要写ifequal a, b,我只能说设计者的脑子进水了!! 唯一值得庆幸的是,django总算允许使用其他的模板系统。(但是我疑惑有多少用户选择其他模板系统?) 关于django的模板哲学(引自hideto的译文) “有些其它的模板语言是基于XML的 XML的格式容易输错,并且XML的模板解析速度也容易变得很慢而难以接受 ” 胡扯!xml格式容易输错吗?{%就不容易输错?!有无数的工具支持xml,无论ide或者简单的编辑器都支持xml。xml解析速度慢吗?完全胡说八道。 “Django模板系统没有设计成可以在Dreamweaver等WYSISYG编辑器中显示良好 这类编辑器有很多限制,Django希望模板作者直接编辑HTML时感到舒适 ” 虽然我也不喜欢WYSISYG编辑器,但是通过攻击WYSIWYG编辑器来给自己的设计不兼容此类编辑器找借口,我只能对设计者树中指! “模板系统的作者意识到大部分Web页面的模板是页面设计者写的而不是Python程序员写的 他们不具备Python知识” 所以又要学一种新语言。而且这种语言又不像xml(因为xml容易输错解析慢),又不像asp/php/jsp(鬼知道什么原因),又不兼容wysiwyg编辑器(因为希望你直接编辑html时感到舒适!)……请问,这种模板是要给谁写的?python程序员?html程序员?js程序员?美工?没有一种人会喜欢它。特别是那些拼写equal也拼不清楚的人(操,我都要确认两遍是ifequal而不是ifequals,奶奶的,你就不会简写成ifeq吗?对了,还有一个狗屁的ifnotequal) “模板不能设置和改变变量的值 可以通过自定义模板标签来达到这个目标,但是内置Django模板标签不允许这样做” 是的,我警告过你们了,改变值是邪恶的,其实你们最好回去用xslt模板,django模板只是xslt模板的拙劣的变形,为的是照顾你们这些被蛇般邪恶的py..——哦我是说c,java还有c#惯坏的可怜程序员们的智商。 另一方面,在给template传值的时候,倒可以使用locals()这样邪恶的函数。当然这是python的错,我相信要给django的设计者来选择,如果有可能的话,他一定不会让这么邪恶的事情发生! …… 原谅我用“恶心”两个字形容django,因为我没想到它是如此“独特”。如果不是标题是django,在阅读的时候我还以为这又是哪个山寨框架(参见JE最近热帖)呢! 我只是看了点文档就发觉了这些问题,其实这些问题django的用户不是没有感觉——因为我好奇如此拙劣的设计怎会没有人抱怨,所以我搜索了一下: http://groups.google.com/group/python-cn/browse_thread/thread/c32a8ba1b2e1f5f3/56ad35cbc4dd21d9 一位django的曾经用户因为不堪忍受django而开始自制山寨框架 写道 至少从我个人角度来说,我是离django越来越远了,因为许多不满意的东西无法得到改善,只好另起炉灶了。许多东西django可以说做得还不错,但是仍然有 许多的问题,比如说:
社区的开放性。许多核心成员过分强调他们的哲学,造成他们无法听进去别人的意见,比如template的所谓简洁性就是一个例子。模板的简洁造成功能就有限制, 因此django的模板允许你使用tag。但这样一来造成tag本身就是另一种语言了,而且是由许许多多的人维护的语言。写一个tag我并不认为很轻松。与其如 此,不如直接引入python代码,象许多模板系统一样。用不用是用户的事,但有没有是框架的事。django小组对社区的建设也不尽人意。象ruby有仓库的 网站,不知道django现在有没有,这个问题也早就提过,但是至少从我不开始关注django的时候之前一直没有改善。这一点非常影响一个社区的发展。 过分看重admin功能,以至于把其它可以做得更好的地方给忽略了。比如ajax框架。再比如说自动模板对应,这在ruby, web2py和uliweb中都有,可以非常简化。而django在做这个时候很简单,就是定义了一个render_to_response(),因此说dja ngo的复杂需要你记住许多的模块是如何被导入的,虽然有这些简化的方法,但仍然不够简单。再比如说urls.py,刚开始还是不错,但是后来发现,定义一个包 括了正则式的url还是挺麻烦的,远没有某些Route模块简单。 算了,不说了,各有所爱。 …… 模板为什么会复杂,我认为更多是因为模板本身造成的。比如web2py的模板可以直接嵌入python代码,但是它的模板tag就那么几个,你认为它复杂吗?并 不是模板本向复杂,而是因为模板中的内容复杂。django模板的弱化,导致tag库盛行,但是tag写起来容易吗?它不也算是一个DSL的东西?与其如此还不 如直接使用python代码,至少我认为python代码比tag要简单多了。比如你做一个比较: {% if var is None or a == b %} 不知道现在这个在django中是否可以支持,一个挺简单的比较,怎么就有好几个标签:if, ifequal, ifnotequal。再去djangosnippets上看一看,为if做的扩展tag也有好多,我还写过一个pyif的tag,目的就是可以在django 模板中直接使用python表达式,这本来就是很简单的事,结果django给做复杂了。 …… 举例来说:从一开始我就不喜欢那个DJANGO_SETTINGS_MODULE,真是麻烦死了,它甚至都不能有个缺省的判断。 http://code.djangoproject.com/ticket/824 在这个ticket我其实是想说当不存在时可以有一个缺省的判断。但是下面的回复却是告诉我在使用前应该设置一下。 http://code.djangoproject.com/ticket/904 在这个ticket下,有人给出一个缺省查找的补丁,但是被拒绝,应该是通过 django.conf.settings.configure() 来手工设定,还是很麻烦。 这只是一个例子。说明django在某些地方的独立性和智能化(或缺省设置)的处理上还不够。 可以看到,我刚才说的那几个问题他都提到了。我没提到的问题他也提到了(毕竟是受害者,我目前只是看客罢了) 我其实对于python社区的web框架抱有厚望,很多年以前zope就令我倾倒。可是等了那么多年,许多人推崇的django就是这么一个货色,实在令我大惑不解。也许是因为python社区以前没有足以与它竞争的框架。不过一般而言,如果不考虑平台(譬如GAE),那我前有ROR,后有Grails,怎么都不会选django这个货色。 附笑话一则: 引用 再举个例子,{#
#}和{%comment%}{%endcomment%}都是用来生成注释的,但是前者是不能有换行的,而后者可以任意。可以看出在django的模板中还区 分单行注释和多行注释。以前在邮件列表中就讨论过这件事,但是django团队不同意修改。好象理由就是象c/c++之类的语言有就单行与多行的区别,并且不一 样。麻烦不,用{##}多简单啊。为什么强调不引入过多的程序逻辑,但是到了注释却搞出个单行和多行。所谓的前端开发者谁管别的语言是怎么定义的,django 怎么定义就怎么用呗,这里真是没有必要。只是注释而已,也没有什么特殊的处理原因,还搞出那么多的tag。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-04-04
1. url 就我实际做项目中,感觉灵活性很高,初学者可能会感觉有点烦
2. 模板这个问题,估计现在要改已经是相当困难,成型了嘛。 不过在django中使用其它模板是非常简单的,你不喜欢可以使用mako ,jinja2之类的。django模板这样设计,也不是没有好处的。最起码在django的模板中,你不会看到复杂的逻辑,这其实就是它的目标 |
|
返回顶楼 | |
发表时间:2009-04-04
最后修改:2009-04-04
要直接在模板当中嵌入python代码,恐怕不太现实。python是强制使用tab缩进的,你在html模板片段里面嵌入python代码,本身html就缩进很多层了,这个时候你极难用肉眼保持住正确的python缩进层次(如果嵌入的python代码比较复杂的话)。
所以我的理解,不是django设计哲学的问题,实在是python缩进带来的限制,其实你观察一下,没有一个python web框架是直接拿python代码做模板语言的。 |
|
返回顶楼 | |
发表时间:2009-04-04
我认为缩进不是问题。过去在页面中嵌入java/vbscript/php的人,也都保持有某种缩进格式习惯,只不过各人各样,没有强制。
缩进其实是为了程序逻辑块。如果内置的逻辑标签(比如JSTL)足够,就不用在代码中缩进了。我其实也反对在模板中嵌入大段程序逻辑。问题是django的模板内置功能太弱。开发者需要某种形式的EL,这种EL显然最好利用开发者已有的知识,例如JSP EL像简化的java或者javascript。也完全可以对python做一个裁剪,做一个python el。正如jsp el没有跨行的,python el也可以完全不受缩进的困扰。 BTW,我承认filter是个不错的东西,但是没有好到足以替代某种EL。特别是在需要处理表现逻辑的时候。不是所有逻辑都是业务逻辑,也不是所有表现逻辑都简单到可以转换为一串filter。filter就是smarty的modifer,但是smarty至少默认可以使用所有php内置函数作为modifier。要理解filter和灵活组合运用filter,一样需要学习成本,如果一个程序员不能很快的理解如何使用filter,没有理由写模板的人(我就搞不清楚django的模板的目标用户是谁?)就能很快理解。 还有改变值,我也认为理论上模板不应该改变值,但是仅限于与view无关的部分。为什么view自己的逻辑不能有临时变量?xslt好歹还能声明varaiable(接近常量),django连这也不行(也许行,但我在文档里没发现)。 |
|
返回顶楼 | |
发表时间:2009-04-04
举个例子,每行交替显示的功能。在django模板中需要了解diviseby(靠,我拼对没有?我拼错了。。。但是你知道我意思)这个filter。然而如果是三行交替呢?如果是四行交替呢?如果有el,只要取模就可以了,这个divisibleby怎么搞?
可见divisibleby就是一个不成功的patch。而且对于非英语用户及其不友好。 |
|
返回顶楼 | |
发表时间:2009-04-04
url是麻烦
模板 觉得 extend bloack 不错 python里 感觉也没有比django更合适的用了 |
|
返回顶楼 | |
发表时间:2009-04-06
推荐TG吧...
|
|
返回顶楼 | |
发表时间:2009-04-06
mikeandmore 写道 推荐TG吧...
tg这个名字太sui了,君不见tgbus就被干掉了。 |
|
返回顶楼 | |
发表时间:2009-04-07
django是挺独断的一个框架,要不适应它所谓的哲学,要就用其他的了。
一个框架是不可能让所有用户满意的(那些想让人人都满意的框架大都挂了)。 此外不少觉得不适应的东西,自己稍微做点改动就可以了。 比如希望默认import某些东西,只想要创建一个对应的文件模板就可以了。 template的自动指定,自己对render_to_response再做个简单的包装就可以了。 |
|
返回顶楼 | |
发表时间:2009-04-07
robbin 写道 要直接在模板当中嵌入python代码,恐怕不太现实。python是强制使用tab缩进的,你在html模板片段里面嵌入python代码,本身html就缩进很多层了,这个时候你极难用肉眼保持住正确的python缩进层次(如果嵌入的python代码比较复杂的话)。
所以我的理解,不是django设计哲学的问题,实在是python缩进带来的限制,其实你观察一下,没有一个python web框架是直接拿python代码做模板语言的。 大多人想内嵌python代码,并不是想if什么都需要的(这些模板会内置支持)。 主要是想做一些表达式计算。 比如做类似s.split(),add(1,2)这样的操作。 对表达式的支持很多python的模板语言已经支持了,比如geshi、jinja(一个类似django模板的模板)。 MaKo更是存储的python语法。 当然,同python一样,这个模板也是要求缩进的。 |
|
返回顶楼 | |