Django与其他Python Web框架相比有何优劣之处?

61

我已经尝试过存在的每个Python Web框架,花了很长时间才意识到没有一种银弹框架,每个框架都有其优缺点。我最开始使用的是Snakelets并且非常享受在较低级别上控制几乎所有内容而不需要太多麻烦,但后来我发现TurboGears,自此以来我一直在使用它(1.x)。像Catwalk和Web控制台这样的工具对我非常宝贵。

但是随着TurboGears 2推出WSGI支持,并在阅读Django和WSGI派系之间的宗教争论后,我真的在选择上犹豫不决,“按照正确的方式”进行,例如学习WSGI,花费宝贵的时间编写Django和其他全栈框架中已经存在的功能,而不是使用Django或某个高级框架为我完成所有事情。我能看到后者的缺点非常明显:

  1. 我在此过程中没有学到任何东西
  2. 如果我需要做任何较低级别的事情,这将是一种痛苦
  3. 仅使用身份验证的基本网站所需的开销是疯狂的(在我看来)

因此,我想问的问题是,哪个选择更好,还是只是个人观点的问题,如果Django能以最小的麻烦实现我想要的身份验证和对数据库进行CRUD界面,那么我应该咬紧牙关并使用Django吗?我尝试过Werkzeug、Glashammer和其他朋友,但AuthKit和Repoze吓到了我,而且设置基本身份验证需要很多步骤。我看了Pylons,但文档似乎有所欠缺,在涉及简单功能如身份验证或CRUD界面时,不同的维基页面和文档似乎互相矛盾,具有不同版本的hack方法等等。

感谢S. Lott指出我的表述不够清晰。我的问题是:长远来看,以下哪个选项值得投入时间学习,但短期内又不会太痛苦(例如,是否有一些折衷方案?)—— 学习WSGI 还是 选择一个“电池包含”的框架?如果选择后者,我希望能得到建议,是再次尝试Django、坚持使用TurboGears 1.x,还是尝试其他框架。

此外,我尝试过CherryPy,但似乎找不到足够好的CRUD应用程序,可以立即使用。


你能澄清一下你的问题吗?在什么选项中“哪个更好”?Django vs. TurboGears 1 vs. TurboGears 2?请澄清,这样我们才知道你真正需要什么帮助。 - S.Lott
13个回答

55

Django和WSGI阵营之间的宗教争论

你似乎有些困惑WSGI是什么以及Django是什么。说Django和WSGI在竞争就像说C语言和SQL在竞争一样:你正在比较苹果和橙子。

Django是一个框架,WSGI是一种协议(由Django支持),用于服务器与框架的交互。最重要的是,直接学习使用WSGI有点像学习汇编语言。这是一个很好的学习经验,但不是你应该为生产代码做的事情(也不是它的初衷)。

无论如何,我的建议是自己弄明白。大多数框架都有“在一个小时内制作维基/博客/投票”类型的练习。花一点时间去尝试每一个,并找出你最喜欢哪个。毕竟,如果你不愿意尝试不同的框架,怎么能决定呢?


21

我认为你对使用Django或类似的全栈框架“学不到任何东西”持过于悲观的态度,并低估了文档和大型社区的价值。即使使用Django仍然存在相当大的学习曲线;如果它不能实现你想要的所有功能,那么框架代码也不是无法理解的。

一些个人经验:我花了几年时间在Twisted/Nevow、TurboGears和其他一些Python Web框架上,有时候这个框架代码永远不完整并且在我下面进行重写,文档通常不存在或错误,并且唯一可行的支持方式是通过IRC(在那里我经常得到很好的建议,但如果问太多问题就感觉自己在强求)。

相比之下,在过去的几年中,我用Django完成了几个站点。与以前的经验不同,它们实际上已部署并运行。 Django的开发过程可能缓慢而谨慎,但它导致更少的比特腐烂和废除,并提供实际有用的文档。

HTTP身份验证支持Django,如果你在#3中提到的就是最终实现的。


你如何比较repoze.bfg在文档、支持、完善度等方面的表现? - Sridhar Ratnakumar

16

我建议再看一下TG2。我认为人们没有注意到自上一个版本以来所取得的进展。除了可用的不断增长的WSGI工具栈之外,还有一些TG2特定的项目需要考虑。以下是一些亮点:

TurboGears管理系统 - 这个CRUD接口可以完全使用声明性配置类进行自定义。它还与Dojo集成,可以给您提供无限滚动的表格。服务器端验证也是自动化的。管理界面使用RESTful URL和HTTP动词,这意味着使用行业标准可以轻松地进行编程连接。

CrudRestController/RestController - TurboGears提供了一种结构化的方式来处理控制器中的服务。只需扩展我们的RestCcotnroller,即可提供使用标准HTTP动词的能力。 将Sprox与CrudRestController相结合,您可以在应用程序的任何位置放置CRUD,并使用全自定义的自动生成表单。

TurboGears现在支持mime类型作为url中的文件扩展名,因此您可以使用与呈现HTML(从控制器返回字典)相同的接口呈现.json和.xml文件。

如果您单击链接,您将看到我们使用Sphinx构建的新文档集,这比以往的文档更广泛。

在最好的Web服务器, ORM模板系统(选择您自己的)的支持下,很容易看出为什么TG对于那些想要快速上手并且在网站增长时仍然具有可扩展性的人是有意义的。

TurboGears通常被视为追求一个移动目标,但我们对发布始终如一,这意味着您不必担心从主干中获取所需的最新功能。未来即将到来:更多的TurboGears扩展将允许您的应用程序通过paster命令轻松增加功能。


2
从技术上讲,我在Turbogears方面没有问题。但是我发现社区比Rails / Django / web2py更加精英主义,并且对新手的帮助不够。 - hoju

11

你的问题似乎是“学习WSGI并自己做一切是否值得”,或者使用一个“为你做所有事情的全栈框架”。

我认为这是一个虚假的二元对立,有一个明显的第三种方法。TurboGears 2试图提供从“为您做所有事情的”风格框架到了解WSGI中间件,并能够定制框架的几乎每个方面以适应您的应用程序需求的平滑路径。

我们可能不会在每个层次和每个领域都取得成功,但特别是如果您已经拥有一些TurboGears 1的经验,我认为TG2的学习曲线起初会非常容易,并且您将能够在需要时深入了解。

针对您的特定问题:

  • 我们提供一个授权系统,可以与TG1匹配。
  • 我们提供一个名为tgext.admin的开箱即用的“django admin”类似接口,与dojo结合使用非常棒,使其具有类似电子表格的界面。

我还想谈一下其他几个选择并谈谈其中的好处。

  • CherryPy. 我认为CherryPy是一个很好的Web服务器和一个不错的极简Web框架。虽然它不是基于WSGI内部的,但具有良好的WSGI支持,虽然它不提供“全栈”体验。但对于需要快速且不特别适合Django或TurboGears提供的默认设置的自定义设置而言,这是一个很好的解决方案。

  • Django. 我认为Django是一个非常好的紧密集成的网站开发系统。如果您的应用程序和工作风格在其标准设置内很好地适合,则可以非常棒。但是,如果您需要调整DB使用情况,替换模板语言,使用不同的用户授权模型或以其他方式进行不同的操作,您很可能会发现自己与框架抗争。

  • Pylons是一个很棒的极简主义Web框架,类似于CherryPy。与CherryPy不同的是,它在整个系统中启用了WSGI,并提供了一些合理的默认设置,如SQLAlchemy和Mako,可以帮助您良好地扩展。新的官方文档比旧的维基文档质量高得多,而您似乎查看的是旧文档。


  • 7
    你看过CherryPy吗?它简约高效,易于使用。它足够低级别,不会妨碍你的工作,但又足够高级别,可以隐藏复杂性。如果我没记错的话,TurboGears就是基于它构建的。
    使用CherryPy,你可以选择几乎所有内容。(模板框架、ORM(对象关系映射)等后端选项)

    7

    学习WSGI

    WSGI非常简单..它基本上是一个看起来像这样的函数..

    def application(environ, start_response) pass
    

    当收到HTTP请求时,该函数被调用。environ包含各种数据(如请求URI等等),start_response是一个可调用的函数,用于设置标头。
    返回值是网站的正文。
    def application(environ, start_response): start_response("200 OK", []) return "..."
    实际上就是这些。它不是一个框架,而更像是用于Web框架的协议。
    对于创建网站,使用WSGI并不是“正确的方法” - 使用现有的框架才是...但是,如果您正在编写Python Web框架,则使用WSGI绝对是正确的方法...
    使用哪个框架(CherryPy、Django、TurboGears等)基本上是个人喜好。在每个框架中尝试一下,看看哪个最合适,然后使用它。有一个关于这个问题的StackOverflow问题(带有很好的答案),"Recommendation for straight-forward python frameworks"

    2

    你看过web2py了吗?最近我评估了许多Python Web框架后,决定采用这个。如果你还没有使用过,请也尝试一下Google App Engine。


    2
    我认为正确的答案取决于您实际想要和需要什么,因为长期来看什么对您有价值取决于您长期需要什么。如果您的目标是尽快部署应用程序,则“更简单”的路线,即Django,肯定是正确的选择。一个经过充分测试和文档化的系统所提供的价值是无法低估的。
    另一方面,如果您有时间学习各种新事物(这些新事物可能适用于其他领域)并希望具有最广泛的自定义范围,则类似Turbogears的东西更优秀。Turbogears为您提供了最大的灵活性,但是您必须花费很多时间阅读外部文档,例如Repoze、SQLAlchemy和Genshi,才能使用它完成任何有用的工作。在某些情况下,TG2文档故意比TG1文档少一些详细信息,因为认为外部文档比以前更好。这种事情是障碍还是投资,取决于您自己的要求。

    1

    Pylons 对我来说是一个很棒的工具:

    • 一个真正的 Web 框架(CherryPy 只是一个 Web 服务器),
    • 小型代码库 - 重用其他项目,
    • 完全考虑了 WSGI,并基于 Paste 编写,
    • 允许您立即编写应用程序并在必要时触及低级位。

    我曾经使用过 CherryPy 和 TurboGears,并查看了许多其他框架,但没有一个像 Pylons 一样轻便和高效。请查看Google 上的演示


    1

    Django绝对值得学习,而且听起来它会符合你的需求。它带有的管理界面易于上手,并且它使用认证。

    至于“更低级别的任何东西”,如果你指的是sql,那么通过extra关键字将sql插入查询是完全可能的。从样式上讲,您应该尽可能避免这种情况。

    至于“不学习任何东西”……真正的问题在于您的偏好是主要学习低级别还是高级别的内容,这几乎是任何人都无法为您回答的问题。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接