"Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计"。如果你正在构建类似于电子商务网站的东西,那么你应该选择Django。它可以快速完成您的工作,您不必担心太多的技术选择。它提供了从模板引擎到ORM所需的一切。它会对您构建应用程序的方式进行轻微的偏见,这对我来说是好事。而且它拥有所有其他库中最强大的社区,这意味着可以轻松获取帮助。
"Flask是一个基于Werkzeug、Jinja 2和良好意图的Python微框架"。请注意,“微框架”可能会误导您。这并不意味着Flask是一个草率的库。这意味着Flask的核心非常简单。与Django不同,它不会为您做出任何技术决策。您可以自由选择任何模板引擎或ORM。即使它默认使用Jinja模板引擎,您也可以随时选择自己的模板引擎。据我所知,Flask非常适合编写API端点(RESTful服务)。
"Twisted是一个用Python编写的事件驱动网络引擎"。这是一个高性能的引擎。它之所以快速,主要是因为有一种称为deferred的东西。Twisted是建立在deferred之上的。对于那些不了解deferred的人来说,它是实现异步架构的机制。Twisted非常快。但它不适合编写传统的Web应用程序。如果您想做一些低级网络操作,则可以使用Twisted。
"Tornado是一个Python web框架和异步网络库,最初由FriendFeed开发。通过使用非阻塞的网络I/O,Tornado可以扩展到数万个打开的连接,非常适合需要与每个用户保持长连接的应用程序,如长轮询、WebSockets等。" Tornado位于Django和Flask之间。如果你要用Django或Flask编写什么,但需要更好的性能,可以选择Tornado。如果它被正确地架构,它可以很好地处理C10k问题。
"Cyclone是一个Python Web服务器框架,它将Tornado API实现为Twisted协议"。现在,如果你想要一些几乎和Twisted一样高效但易于编写传统的Web应用程序呢?那就来试试Cyclone吧。我更偏向于Cyclone而不是Tornado。它有一个非常类似Tornado的API。事实上,这是Tornado的一个分支。但问题是它的社区相对较小。Alexandre Fiori是唯一的主要提交者。
"Pyramid是一个通用的、开源的Python Web应用程序开发框架。它的主要目标是使Python开发人员更容易地创建Web应用程序"。我没有真正使用过Pyramid,但我看了文档。从我的理解来看,Pyramid非常类似于Flask,我认为你可以在任何Flask适用的地方使用Pyramid,反之亦然。
编辑: 欢迎评价其他框架!
这篇文章介绍了 Python Web 开发中五个流行的框架,包括 Django、Twisted、Tornado、Flask、Cyclone 和 Pyramid。这些框架在不同的场景下都有自己的优势和适用性。这显然是一个有些偏颇的答案,但这并不等同于错误的答案;你应该始终使用Twisted。我之前回答过类似的问题,但由于你的问题并不完全相同,所以这里有一些原因:
Twisted在speed.twistedmatrix.com网站上持续监控我们的性能。我们也是第一个被PyPy类似网站监测的项目之一,从而确保了Twisted在任何关心Python高性能应用程序的运行时上具有良好的性能。
许多人似乎发现Twisted非常有用。以至于他们中的许多人已经扩展了它,并使他们的扩展可供您使用。
开箱即用,Twisted包括:
spawnProcess
,这种 I/O 调度也可以转换为 CPU 调度。 - Glyph我喜欢@Glyph的回答。 Twisted是一个非常全面、丰富的Python框架。 Twisted和Tornado有着非常相似的设计,而我非常喜欢这种设计:
但我想要强调的是Tornado,它更受欢迎,最近也变得越来越流行。 Tornado和Twisted一样使用回调式编程,但可以使用tornado.gen.engine(Twisted中的twisted.internet.inlineCallbacks)进行内联。
最好的评论来自http://cyclone.io网站。cyclone试图混合Twisted和Tornado,因为:
Twisted是公共可用的最成熟的非阻塞I/O库之一。Tornado是FriendFeed的Web服务器的开源版本, 它是Python中最受欢迎和快速的Web服务器之一,并具有非常不错的构建Web应用程序的API。
其思想是将Tornado的优雅和简单的API与Twisted的事件循环桥接起来,从而支持大量协议。
但是在2011年,tornado.platform.twisted已经出现,带来了类似的功能。
Tornado有更好的性能。它也与PyPy无缝协作,并获得巨大的收益。
与Twisted一样。Tornado具有tornado.process和很多基于它的rpc服务。
有71个基于Tornado的包,相比之下,Twisted有148个,Gevent有48个。但如果你仔细观察并计算软件包上传时间的中位数,你会发现Twisted的最老,然后是Gevent,Tornado是最新的。
此外,还有tornado.platform.twisted
模块,它允许您在Tornado上运行为Twisted编写的代码。
使用Tornado,您可以使用来自Twisted的代码。没有必要使用Cyclone,它只会使您的代码变得更混乱。
截至2014年,Tornado被认为是广泛接受和默认的异步框架,可在Python2和Python3上工作。此外,最新版本4.x带来了很多来自https://docs.python.org/dev/library/asyncio.html的功能。
我写了一篇文章,解释了我为什么认为Tornado - 最佳的Python Web框架,其中我写了更多关于Tornado功能的内容。
(更新:我很遗憾地惊讶于这里有多少答案推荐或甚至提到了 Gevent - 我认为这与这个优秀的库的流行度、性能和易用性不成比例!)
Gevent 和 Twisted 并不是互斥的,尽管相反可能一开始看起来更明显。有一个名为 geventreactor
的项目,它允许相对平稳地利用两个世界的最佳方面,即:
inlineCallbacks
在处理许多协程时表现性能不够好,而且在使用上也不够简单/透明:到处都是 yield
和 Deferreds
;往往难以构建某些抽象;使用裸的 Deferred
或者更多地使用 @inlineCallbacks
时,堆栈跟踪非常无用。IReactorProcess.spawnProcess
。我个人目前使用的是Gevent 1.0rc2与Twisted 12.3配合使用,并通过 geventreactor
桥接。我已经实现了自己尚未发布的 geventreactor
添加和增强功能,希望很快可以作为 geventreactor
的原始GitHub存储库的一部分发布:https://github.com/jyio/geventreactor。
我的当前布局允许我使用Gevent的良好编程模型,并利用如非阻塞socket
、urllib2
和其他模块等功能。我可以使用常规的Python代码来完成常规任务,而不必像Twisted那样学习曲线陡峭且不方便地执行甚至简单的基本任务。我还可以轻松地使用大多数第三方库,这些库通常在Twisted中要么无法使用,要么需要使用线程。
我也可以完全避免使用回调函数进行基于回调的编程时可能出现的尴尬和过于复杂的情况,而是使用greenlets(而不是Deferred
和回调函数以及/或@inlineCallbacks
)。
(这篇答案基于我在实际项目中使用Twisted和Gevent的个人经验,其中对Twisted的使用经验更为丰富(但我不自称是Twisted专家)。我所编写的软件没有使用太多Twisted的功能,因此根据您对Twisted所需功能的要求,混合使用Gevent和Twisted的(相对较少的)额外复杂性可能不值得麻烦。)