阅读更多

25顶
1踩

开源软件

原创新闻 我恨Django的5个理由和我爱Django的5个理由

2008-04-22 08:50 by 正式记者 levis2000 评论(12) 有14335人浏览
我恨Django的5个理由
虽然我喜欢Django,但是无论如何它也有瑕疵的,让我先把"丑话"说在前面吧.

Ajax很难和Django一起用
大部分的Django社区都认为把Javascript helpers和python framework放到一起并不是个很好的主意。虽然我理解Javascrip是基本知识,人人都懂得一些,但是我仍然不赞同这个主意。SQL和Javascript一样也是基本知识,但是我们仍然要ORM来提炼出共用和重复的内容。当然,通过simplejsonJQuery,能够快速的建立Ajax应用。但是在Python和Javascript之间频繁切换让人很头痛。

缺少identity map
如果你用Model.objects.get从某数据库中两次获取相同的一行,你会得到不同的对象.除了两次查询的性能问题以外,当你只需要更新其中一个对象而另外一个不更新时,你会发现很有意思的事情。另外,你如果同时更新两者,数据库可能会出现前后不一致的结果。

这里是一个例子:
See this code
In [2]: from django.contrib.auth.models import User
In [3]: usr1 = User.objects.create_user('ram', 'demo@demo.com', 'demo')
In [4]: usr2 = User.objects.get(username='ram')
In [5]: usr3 = User.objects.get(username='ram')
In [6]: user2 == user3
—————————————————————————
NameError                                 Traceback (most recent call last)
…
In [7]: usr2 == usr3
Out[7]: True
In [8]: usr3.username = 'not_ram'
In [9]: usr3.save()
In [10]: usr2.username
Out[10]: u'ram'
In [11]: us3.username
—————————————————————————
NameError                                 Traceback (most recent call last)
…
In [12]: usr3.username
Out[12]: 'not_ram'
In [13]: usr2 == usr3
Out[13]: True


你可以在settings.py里面设置SESSION_EXPIRE_AT_BROWSER_CLOSE 来定义session类型。但是你不能按用户设置他们。这虽然是个次要问题,但是你仍然不得不每个应用都这样弄下,我好像记得不这样做的话,函数是不能运行的。

NewForms非常有限
比如你需要form包含不定数量的field.你会如何用NewForms类来做这个事情

from django import newforms as forms
class MyForm(forms.Form):
    foo = froms.CharField()
        bar = froms.CharField()


这样只能创建固定数量的field.当然也有方法来创建不定数量field,但是并不很容易或者说不容易优雅的实现这一点。

配置信息混淆了公共信息和隐秘信息
比如我发布一个应用,里面有一个MIDDLEWARE_CLASSES参数,我不希望别人修改这个。同样的,大部分情况下,INSTALLED_APPS,应该是用户不能修改的,(除非你发布独立应用)。这意味着必须对 settings.py 进行版本管理,但是里面又包含了数据库信息,和 SECRET_KEY 之类的不能够进行版本控制的内容,这又表明不能对settings.py进行版本控制。

就 os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 这句来说,settings.py需要重新制定。

另:
两个曾经困扰我的问题已经解决:
1.不能继承Models。现在可以用query-refactor完成。
2.URL和View的映射曾经是个问题,但是regexes外美的解决了这个问题。

我爱Django的5个理由

说完了我讨厌Django的理由,下面该说说我为什么喜欢Django了:

很棒的Admin interface
我曾经给一些人演示过Django,在models.py写几行代码就可以生成Admin interface,让人惊讶得下巴都快掉了.每次演示都是这么简单,在这里,你可以看到很多人都不相信这么简单,并且怀疑里面是不是隐藏了代码.

当然Admin不只是炫耀的工具,当我做一个新的站点的时候,我会先写views来查询数据库,所以Admin是不可或缺的.在大部分情况下,写写Model,玩玩Admin对我来说就足够了.

内容全面更新及时的文档
当时我在网上寻找python框架找很久,最后不得不在Django和Turbogears中间选择一个.由于Django的文档写的更好,而且还有更多的教程,所以最后我投向了Django的怀抱.

社区的支持
无论我在django-usersIRC#Django问什么问题,都能得到很多热心的回复帖子.据我所知很少社区有这样的文化,所谓的牛人都很愿意帮助新人.

很多可重用的组件/插件
django-mptt 可以用来进行对关联性数据的处理,如果需要做一些投票,注册或者wiki之类的小功能,可以到这里去看看.

让事情变得容易,让不可能变为可行
如果需要做一些查询如:SELECT * FROM ... WHERE ..., 就用Model.objects.filter. 如果你需要查询大量关系类型数据的话,那么可以用select_related.如果你需要对一个关系建模,而Django ORM用不上的话,那么可以在extra写sql的方式.有很多GROUP BY或者UNION ALL之类的SQL要处理? 可以试下connection.cursor.根据你的需要,这些小东西可以让你做的事情变得很简单.
和模版的观念类似,如果你需要替换变量的话,这里有{% for ... %}和{{ ... }}可以使用.如果是更复杂的模版,则可以使用模版标签

我的分析有道理吗?那么你是爱Django还是恨Django呢?理由是什么?
25
1
评论 共 12 条 请登录后发表评论
12 楼 maplye 2009-02-25 10:59
模板功能弱了
11 楼 towjzhou 2008-05-22 15:27
django的select_related相当脑残。
10 楼 kkndone 2008-04-24 10:19
我主要是不喜欢django这个名字,读都不知道怎么读,更没兴趣去尝试了
9 楼 剑事 2008-04-23 17:54
django的 templates 应该借鉴下  freemarker
8 楼 pickerel 2008-04-23 11:20
打错了,是Django的模板感觉是面向web设计者的,很不灵活的说。
7 楼 pickerel 2008-04-23 11:20
Django感觉是面向web设计者的,很不灵活的说。
6 楼 d4rkl0rd 2008-04-22 20:39
还有一点..google非常重视django
5 楼 剑事 2008-04-22 20:07
模板语言 感觉很弱啊

连二维数组都不能显示
4 楼 hanssonlan 2008-04-22 19:42
is this news?
3 楼 hellas 2008-04-22 12:57
引用
你可以在settings.py里面设置SESSION_EXPIRE_AT_BROWSER_CLOSE 来定义session类型。但是你不能按用户设置他们。

虽然通过重写middleware可以实现想要的功能,不过实在想不通为什么django不把这个特性放进来。
2 楼 fangzhouxing 2008-04-22 10:16
准备使用Django(看中其对RESTful Web Service的出色支持),努力学习中!
1 楼 QQbyte 2008-04-22 09:35
说得很好,我觉得Django不像rails那么过于灵活,我用刚刚好。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • cpp的缺点及学习他的必要性

    最近以来总有人跟我说Cpp没什么用,效率不及C,移植不如java,方便不如C#等等,其实呢,语言,工具也,无论用什么...多层次,导致学习周期实在太长,最合适本科时间慢慢学,二,库杂。基本上一个问题对应一个库一个...

  • C++学习资料

    很多学生朋友C++掌握的不够扎实,推荐一个免费品质不错的学习网站。 www.learncpp.com 简介/入门 0.1这些教程的介绍 0.2编程语言简介 0.3C/C++ 简介 0.4C++开发简介 0.5编译器、链接器和库简介 0.6安装集成开发...

  • 相机标定中各种标定板介绍以及优缺点分析

    点击上方“3D视觉工坊”,选择“星标”干货第一时间送达作者:Jakob W编译:ronghuaiyang(AI 公园)导读各种标定板的解释和分析。准确标定像机对于所有的机器/计算机视觉的成...

  • U3D Pun2 官方文档学习和翻译

    这里是个人学习photon的一些总结,以及学习photon官方文档和对其的部分翻译和整理,都是些个人觉得基础和常用的部分,有什么错误谢谢指出~ pun2官方文档链接...

  • CPP - 头文件

    缺点: 前置声明隐藏了依赖关系,头文件改动时,用户的代码会跳过必要的重新编译过程。 前置声明可能会被库的后续更改所破坏。前置声明函数或模板有时会妨碍头文件开发者变动其 API. 例如扩大形参类型,加个自带...

  • Cpp面试高频题

    (1) 指针和引用的区别 引用: 1.引用初始化完成,将一直绑定一个对象,无法令引用绑定另外一个对象,这就是说引用必须初始化。 2.注意引用初始化的时候,绑定的是一个对象,而引用本身不是一个对象,所以不能定义...

  • Linux 网络编程学习笔记——十五、进程池和线程池

    这样做有如下缺点:本章将分析这两种“池”的细节,给出它们的通用实现,并分别用进程池和线程池来实现简单的并发服务器。进程池和线程池相似,所以这里我们只以进程池为例进行介绍。如没有特殊声明,下面对进程池的...

  • java学习之道 --- 如何学习java?

    其中有许多人是初学者,来问我一些问题,也有一些是已经有过一定的基础,看了我的博客,也有了一些新的认知,来和我讨论。当然,大部分人都是在问我怎么学习,自己不知道该怎么学了,让我出个主意啥的,真正讨论问题...

  • Python学习工具TOP10

    大家好,我是是Dream呀,在我们平时的...** 实话实说,在这些年来的学习生活中,确实有一些很好用的工具,那今天我就来和大家一起分享一下我的开发工具!希望大家可以耐心看完,如果对你也有帮助的话就赶紧收藏起来吧

  • java各种排序算法的稳定性和时间复杂度小结

    冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。   冒泡法:  这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: 复杂度为O(n*n)。当数据为正序,将不会有交换。...

  • 关于如何查找和利用PCL库学习资源的一些心得

    所以把这些心得记录下来,一是为了给自己以后学习PCL库和其他库时提供借鉴,而是希望为一些新上手的PCL库学习者提供一些思路。学习工具PCL库官网《点云库PCL学习教程2》CSDN等博客论坛的教程博文一些外国学术团队的...

  • 在C++中部署python深度学习-学习笔记

    工业界与学术界最大的区别在于工业界的模型需要...但在生产环境下,Python的可移植性和速度性能远不如C++。所以对于深度学习算法工程师而言,Python通常用来做idea的快速实现以及模型训练,而用C++作为模型的生产工具。

  • vulkan学习_使用vulkan kompute在gpu中进行机器学习和数据处理

    vulkan学习Machine learning, together with many other advanced data processing paradigms, fits incredibly well to the parallel-processing architecture that GPU computing offers. 机器学习以及许多其他...

  • C++多态性分析和与Linux内核中的多态性实现的共性和差异比较

    执行期不可能新增或替换之,由于程序执行时,表格的大小和内容不会改变,所以其建构和村去皆可以由编译器完全掌握,不需要执行期的任何介入”拜编译器所赐,CPP实现多态机制几乎是透明的,程序员几乎不用做什么。

  • C语言学习

    在 1978 年,布莱恩·柯林汉(Brian Kernighan和丹尼斯·⾥奇(DennisRitchie)制作了 C 的第公开可⽤的描述,现在被称为 K&R 标准。UNIX 操作系统,C编译器,和⼏乎所有的 UNIX应⽤程序都是⽤ C 语⾔编写的。由于...

  • 常见Cppcheck检查问题总结(静态检查错误)

    但是我们更应该要知道虚函数的缺点: 如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,使析构函数为虚一般是个坏主意。因为它会为类增加一个虚函数表,对象增加一个...

  • C++代码复用策略及与标准兼容性指南

    在软件工程的广袤天地中,代码复用(Code Reusability)宛如一颗璀璨的明珠,其价值不仅仅体现在减少编写和维护代码的工作量,更在于它对提升软件质量、增强代码的可维护性和可扩展性方面的深远影响。正如计算机科学家...

  • 【C++入门(上篇)】C++入门学习

    C++入门学习

  • C++HTTP请求学习(二)

    http理论学习,ic-client源码解读

  • linux聊天系统,采用微信小程序与PC端双端开发。

    后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

Global site tag (gtag.js) - Google Analytics