背景:学习 python 一个月,django 不到一个月,看公司已有的 django web 代码看郁闷了,吐槽一下
django 的 orm 很令人崩溃,没有自动化的 migration(想想手工 migration,很令人崩溃吧),没有类似 before_save,after_save 的 callback,数据库 schema 写在 model 里面
django 的 urlsconf(类比 rails url mapping)很初级,完全只能用正则,写起来很容易有很多的重复代码
django 的 template 机制很郁闷,使用的不是原生的 python 语言,而是自定义的一套。要做成 rails layout 的效果,只能不断的使用 extends xxx,或者是 template blocking,累死
django 的视图函数(类比 rails controller)的 filter 功能很初级,重用能力很低,不能和 rails controller 各种 filter 机制相比
如果有 django 经验的同学,能否介绍一下这些东西是否有好的解决方案?
migration 可以用 south 或者 evolution 这个插件,不过个人并没有用过,因为总觉得自动化的 migration 不靠谱,所以如果数据重要我肯定会手工去做,数据可以删除我就直接 reset 了。
before_save,after_save 在 Django 里有 Signal,其中有 pre_save, post_save 等函数可以实现。
urlsconf 这个只能慢慢改了。
template 除了性能其他感觉都可以,多用用 templatetags 能方便很多事。
视图函数,generic view 在 1.3 里面已经用 class 现实了,重用性提高了很多。至于这里的 filter 不知道说的是不是 decorator。
几年来一直用 Django,感觉束手束脚的,也说不出具体问题在哪里。
直到接触了 Rails,才发现:
1、database migration 就应该作为标准特性集成嘛 2、Django 的 MTV 不够自动化 3、Rails 的模块化、可定制性比 Django 强太多了
一开始在 python 的 web 框架和 rails 之间犹豫了一下,后来想通:为什么放着最好的不用而去用模仿品呢?就选择 Rails 了。
Py 的 web 框架也一直在留意,感觉一是重复开发,二是需要太多组装。
我对 Django 比较熟,还是有发言权的 Django 绝对不是基于 python 的 rails,绝对不是 rails 的仿制品,二者的理念不一样,Django 相对 rails 来说实现方式还是比较底层的,比 rails 简陋,比 rails 灵活,代价就是相对于 rails,Django 很多东西还得自己动手 跟 rails 在 ruby 社区的权威不同,Django 在 python 社区被很多人吐槽,抱怨被 Django 框住了,只能用 Django 的方式写程序,估计他们用了 rails 就不这么抱怨了
写过一些 py 和 django 的应用,说说感受: #1 整体框架比较简陋,这样需要手动做很多工作,尽管也有类似 rails 的脚本例如 runserver,syncdb 等,但简陋,麻烦 #2 template 中不能写 py 代码,这个算好处也算坏处吧 因为视图部分,一点逻辑代码不写,还是不太现实的 就像 freemarker,为了些逻辑,还不是得发明很多语句和 macro 宏 #3 模型层根本就没法与 rails 比了,也许是 py 自身语言的特点吧 #4 等吧 总体来说,py 的 django 还是要给高手用的,但凡约定多的例如 rails 是给中低手用的(高手做构架就好了)
我也来说一下吧。
最后说一下我吧。写过一段时间 Django,近一段时间在用 tornado,最近写 python-china.org 就是用的 tornado 做框架与 server,两天时间搭起一个可用的 demo,再两天上线。
tornado 更简陋,没 orm,没 form,就一个 server + template,剩下的都要自己来。其实我还挺享受自己去组合,自己去组织的这个过程的。
@fantaxy025025 相反,新手学 django 的多。
说 Django 简陋是相对于 rails,比起 python 里面的微型框架,django 算是中量级的了 Django 的 View 不叫“View”,叫“Template”,所以 Django 是 MTV 模式而不是 MVC 模式。 Django 的 Model 只用来定义数据表结构,基本上没有业务逻辑,业务逻辑写在 View 中,通常用 Django 写网站是面向过程的
Django 一个子目录一个 app,比如/news/,/groups/,/bbs/,比起 rails 一个子目录一个 node 更能直观的表达网站的总体结构,打个比方,网站的 groups(小组) 结构 Django 小组地址 小组内帖子的地址 /groups/1/ /groups/topic/1/ Rails /groups/1/ /topic/1/ Django 增加或删除网站的一个模块 (比如新闻模块、论坛模块),只需要增加或删除一个子目录
Python 针对于 Ruby 也没有什么太多决定性的优势。Python 性能略好与 Ruby,Ruby1.9x 性能也已不错。 数据分析?python 和 ruby 也能力相仿而已。
有人推荐 ruby-china,一进来竟然就看见这帖子,作为 Rails 黑必须来吐槽一下 Rails。
就算除掉 Python 对 Ruby 的优势 (其实 Python 的优势也就是库多样性总体来说比 Ruby 好一点),Rails 还是不如 Django。
python 和 ruby 只是选择了不同的语法,谁比谁呆板还很难说
http://stackoverflow.com/questions/1113611/what-does-ruby-have-that-python-doesnt-and-vice-versa
Python 作为一门语言来讲还是不错的,或者说与 ruby 各有特点吧,Python 相关的各种库也是很多的。不过 Python 相关的框架感觉没有框架的样子,做为一个工具用用还可以,一旦想把它做为一个底层结构要在其上进行扩展开发困难重重,感觉就是没有好好设计
Django View 用起来很蛋疼,得自定义很多 filter
Rails 的 View 对应到 Django 是 Template。
是的,是要定义 filter。但是你用 Rails 的时候,你也会做同样的事情,你管那叫 reopen class。
比如,你打算对代码语法高亮。
Rails
class String
def syntax_highlight
do_syntax_highlight self
end
end
<%= source.syntax_highlight %>
Django
@register.filter
@stringfilter
def syntax_highlight(value):
return do_syntax_highlight(value)
{% source|syntax_highlight %}
ORM 不完善
是的,和 SQLAlchemy 没法比。但我相信 Rails 的 Active Record 可以更烂。
Form 需要定义一个单独的类,蛋疼
不同的表单要操作同一个 Model 的不同 Attribute。你用 mass assignment 不也要加个 role。 表单处理处于 Model 和 Controller(Rails)/View(Django) 的中间地带,无论是放在 Controller(Rails)/View(Django) 里,还是放在 Model 里,还是独立成 Form,都很碰到蛋疼的时候。
Django Admin 是个花瓶
就当是个界面更容易定制的,对 ForeignKey 理解更好的 PHPMyAdmin 用就是了。
#25 楼 @bhuztez 发现本帖最强力反吐槽,给力! @gaicitadie 在 rails 与 Django 的 app 目录结构分析,Django 完胜 @huacnlee Django.admin 的确花瓶,聊胜于无,呵呵; orm 须改进的很多,老毛病了,缺少跨表查询的 API 语法; Django View == Rails Conttroler,模板内建 filter 增强,能 evaluate python code, 些会更优; Rails 模板标记<%= Blah blah blah %>与 HTML 内建标记视觉冲突严重,就不能改改? @lepture python-china.org需要好好搞起来,多吐槽,多改善,:-) @sunzheng91 Django 的 Tutorail 很友好,Pylons 和 Tornado 还是小户;Rails 不易上手,概念多,技巧多,ActiveRecord 名字怪;Rails 好处是 The Best Practice,官方 Gem 真慢,如果国内没淘宝撑下来,呵呵呵 @* Django 文档水平很高,UI 舒服,虽然 rake doc:app 还行,但是 Rails 为啥不用 Sphinx 这一优良文档工具呢? 另外,URLConf 并不是很糟糕
@gaicitadie hi,不知道如何联系你,我想向你请教下 django 和 rails 一些技术问题,我是 django 开发者。我 Q 3 0 30159