瞎扯淡 用过 Django 的来吐槽一下吧

lanwen · 2012年02月01日 · 最后由 evilloop 回复于 2015年12月23日 · 27499 次阅读

背景:学习 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 经验的同学,能否介绍一下这些东西是否有好的解决方案?

用 Pyramid 把,orm 用 sqlalchemy, sqlalchemy 有 Alembic 支持 migration。

因为 django 很灵活,大多数东西需要自己做

#1 楼 @vince 对于 django 来说,有什么好的 orm 替代方案吗?或者是有什么好的解决方式?

很久没关注 Django 了,试试 Pyramid,或许就喜欢上了呢。

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。

你就用 rails 的 migration 来 migration 不就得了?

Django 架构比较大,也比较乱。还是 Pylons 好

影响最深的是 django admin。

django 成也 admin 败也 admin 而且 django 扩展性 和 rails 的 gem 比起来 有点惨了 还是 rails 爽一点

接触 Rails 之前,用过 Django 半年多,做些小项目,说是在的,没有多少让我喜欢的,后来发现 Rails 以后果断转入 Ruby

几年来一直用 Django,感觉束手束脚的,也说不出具体问题在哪里。

直到接触了 Rails,才发现:

1、database migration 就应该作为标准特性集成嘛 2、Django 的 MTV 不够自动化 3、Rails 的模块化、可定制性比 Django 强太多了

一开始在 python 的 web 框架和 rails 之间犹豫了一下,后来想通:为什么放着最好的不用而去用模仿品呢?就选择 Rails 了。

Py 的 web 框架也一直在留意,感觉一是重复开发,二是需要太多组装。

#5 楼 @risent 多谢,回头试试

我对 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 是给中低手用的(高手做构架就好了)

我也来说一下吧。

  1. 对于 pythoner 来说,Django 已经很庞大了,不应该像各位所说的简陋呀。当然,前提是你要用过其它框架。
  2. @fantaxy025025 template 中不能写 py 代码,这是它本身的设计思路,做前后端分离,让前端不用懂 python
  3. django 的 admin 确实很方便,很省事。小网站用 admin 很快就可以搞定 crud

最后说一下我吧。写过一段时间 Django,近一段时间在用 tornado,最近写 python-china.org 就是用的 tornado 做框架与 server,两天时间搭起一个可用的 demo,再两天上线。

tornado 更简陋,没 orm,没 form,就一个 server + template,剩下的都要自己来。其实我还挺享受自己去组合,自己去组织的这个过程的。

@fantaxy025025 相反,新手学 django 的多。

  • Django View 用起来很蛋疼,得自定义很多 filter
  • ORM 不完善
  • Form 需要定义一个单独的类,蛋疼
  • Django Admin 是个花瓶

说 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 的优势,弥补了 Django 的不足。web2.0 网站、社交网络拼到最后还是拼数据分析

Python 针对于 Ruby 也没有什么太多决定性的优势。Python 性能略好与 Ruby,Ruby1.9x 性能也已不错。 数据分析?python 和 ruby 也能力相仿而已。

有人推荐 ruby-china,一进来竟然就看见这帖子,作为 Rails 黑必须来吐槽一下 Rails。

就算除掉 Python 对 Ruby 的优势 (其实 Python 的优势也就是库多样性总体来说比 Ruby 好一点),Rails 还是不如 Django。

python 相对于 ruby 最大的优势就是功能比 ruby 少,语法更呆板

python 和 ruby 只是选择了不同的语法,谁比谁呆板还很难说

http://stackoverflow.com/questions/1113611/what-does-ruby-have-that-python-doesnt-and-vice-versa

Python 作为一门语言来讲还是不错的,或者说与 ruby 各有特点吧,Python 相关的各种库也是很多的。不过 Python 相关的框架感觉没有框架的样子,做为一个工具用用还可以,一旦想把它做为一个底层结构要在其上进行扩展开发困难重重,感觉就是没有好好设计

#17 楼 @huacnlee

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 用就是了。

匿名 #26 2012年04月16日

Rails 滥用元编程,迫使它的使用者屈服于 DHH 的个人意志,是一个充满奴性的怪物,与 Ruby 的理念不合

为何我很难适应 ruby 这么花哨的作风。还是 ruby 更清爽更直接。不过 rails 倒是真有魅力

Django 用起来还是挺方便的

#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

火了,火了,俩个都用,多好。

#29 楼 @michael 吐槽 Gem,安装完 rails,new 个新项目都需要半天,最后提示有些包没安装成功

需要 登录 后方可回复, 如果你还没有账号请 注册新账号