Python程序员有很多很好的选择来创建Web应用程序和API;Django,Weppy,Bottle和Flask引领潮流。
如果正在开发一个Web应用程序并且已经选择使用Python作为构建它的语言,那么这是一个明智的选择。Python的开发成熟度,强大的库以及广泛的实际应用使其成为Web开发的必需。
现在是困难的部分:从众多可用的Python web框架中选择一个。它们不仅数量在不断增长,而且很难找到最适合你的。如果你正在构建一个快速而又简单的REST API,那么你将不需要任何完整的面向用户的应用程序所需的管道和连接,该应用程序具有用户登录、表单验证和上传处理就可以了。
在本文中,我们将研究13种最广泛部署的Python web框架。我们将关注每种web应用程序最适合构建哪种类型的web应用程序,并研究它们如何在以下六个方面相互竞争:
安装:设置不需要正式的框架项目(它可以简单地作为包含的模块放到现有的项目中)、启动所需的模板文件最少、或者带有某种预先配置的设置,这是多么容易或简单。
文档:几乎每一个像样的Python项目都有文档,可以遍历设置、演示基本用例并提供关于API的详细信息。在这里,我们给这样的框架更高的分数:这些框架展示了如何在教程中创建整个应用程序,包括常见的配方或设计模式,以及超出职责范围(例如提供有关如何运行的详细信息) Python变体(如PyPy或IronPython)下的框架。
管理:这是相对得分,表示配置和维护框架需要做多少工作。默认情况下,工作量最小的框架得分更高。
原生能力:包含多少组件?得分较高的是那些为国际化,HTML模板和数据访问层提供原生支持的框架。还有一些框架使用Python最近引入的异步I/O操作的原生支持。
安全性:提供原生安全措施(如跨站点请求伪造(CSRF)保护和使用加密cookie的会话管理)的框架获得更高的分数。
可伸缩性:大多数Python框架可以利用像Gevent或Gunicorn这样的项目来大规模运行。在这里,我们看一下提升可伸缩性的框架原生特性,如输出和页面片段缓存。
如果你对性能基准感到好奇,请查看TechEmpower正在进行的一系列试验,这些试验比较了各种任务中的多个Web框架,并将代码和方法发布到GitHub并进行不断的重新评估。并非所有讨论中的框架都在那里进行了分析,但是可以很好地了解哪种框架在哪种负载下表现最佳。
我们将分析13个框架。其中五个:CubicWeb,Django,Web2py,Weppy和Zope2,采用“控件”方法,包含你可以想象的Web应用程序所需的大多数功能。其余八个框架: Bottle,CherryPy,Falcon,Flask,Pyramid,Tornado,Web.py和Wheezy.web,提供更简约的外观,交易批量和完整性,简单易用。
让我们从重量级开始吧。
重量级的Python Web框架
CubicWeb
CubicWeb被称为“一个支持重用和面向对象设计的语义Web应用程序框架。”这是一个有趣的系统,强调使用抽象和可重用的代码块称为“多维数据集”,但对于某些开发人员来说可能过于抽象或特殊。
多维数据集是具有模式(数据模型),实体(编程逻辑)和视图的软件组件。通过组合多个立方体,每个立方体执行自己的任务,可以通过重用自己的代码和其他代码来编写软件应用程序。
CubicWeb的核心是提供每个Web应用程序使用的基本搭建材料:用于数据连接和存储的“存储库”;用于基本HTTP请求/响应和CRUD操作的“Web引擎”;以及用于建模数据的模式。所有这些都在Python类定义中描述。要设置和管理CubicWeb的实例,可以使用类似于Django的命令行工具。
CubicWeb似乎没有使用Python 3的原生异步功能。包含异步的一种迂回方式是使用cubicweb.pyramid模块将Pyramid框架用作Web服务器,并使用异步构造在Pyramid上绘制。但是现在看起来更加直截了当。
要在CubicWeb应用程序中获取或操作持久数据,可以使用关系查询语言(RQL),它采用模糊的SQL语法,但在W3C的SparQL之后进行模式化。CubicWeb的理由再次是抽象:RQL提供了一种高度分离的路径来相互关联各种数据源。但是,随着它的实现,通过手动构建查询作为字符串,它可能会让习惯于ORM的开发人员感到过时。
使用CubicWeb还有其他障碍。首先,设置可能很麻烦。因为CubicWeb有很多依赖项,所以最好使用pip install来获取所有依赖项。可能还必须在本地环境中执行一定数量的手动调整。这与运行pip install或将框架代码放入另一个项目的子文件夹的其他框架形成鲜明对比,这就是所需要的。
另一个潜在的问题是缺少本机模板引擎;生成HTML留给开发人员。可以通过使用像Jinja2这样的第三方模板系统或选择为Web UI提供工具的多维数据集来克服这个问题,例如Boostrap HTML框架的工具。
CubicWeb的一个长期问题,缺乏Python 3支持,目前已经解决。截至2016年6月的版本3.23,CubicWeb支持Python 3,但Twisted等模块本身并未完全移植。
与Web2py一样,CubicWeb将其冗长的文档称为“书籍”。它需要时间来解释CubicWeb的不寻常方法,演示如何构建一些基本应用程序,包括API引用,并且通常不会特定的方式。
Django
自Django首次出现以来已经有十年,它已经成为Python最广泛部署的用于创建Web应用程序的框架之一。 Django配备了你可能需要的大部分组件,因此它倾向于构建大型应用程序而不是小型应用程序。
经过多年在版本1.x后,Django最近在小数点的左边创建了一个版本。 Django 2.0中最大的变化是框架现在只适用于Python 3.4及更高版本。理想情况下,你应该使用Python 3.x,所以使用Django的1.x分支的唯一原因是你遇到了旧版本的Python。
Django吸引力的一个关键部分是部署速度。因为它包含了开发普通Web应用程序所需的许多部分,所以可以快速行动。路由,URL解析,数据库连接(包括ORM),表单验证,攻击保护和模板都是内置的。
将找到最常见的Web应用程序方案的构建块。例如,用户管理可在大多数网站上找到,因此Django将其作为标准元素提供。Django本身具有这些功能,而不必创建自己的系统来跟踪用户帐户,会话,密码,登录/注销,管理员权限等。它们可以按原样使用或扩展,以包含最少量工作的新用例。
核心是BSD,一些组件是LGPLv3。可通过zope.formlib获得;单独安装但作为项目的一部分支持。通过第三方扩展程序提供。
Django具有健全和安全的默认设置,有助于保护Web应用程序免受攻击。将变量放在页面模板中时,例如带有HTML或JavaScript的字符串,除非明确将变量实例指定为安全,否则不会按字面意义呈现内容。这本身就减少了许多常见的跨站脚本问题。如果要执行表单验证,可以使用从简单的CSRF保护到返回详细错误反馈的完整逐个字段验证机制的所有内容。
如果没有强大的文档可以使用像Django那样丰富和广泛的功能。Django的文档站点从多个角度深入研究框架的各个方面。使用Python 3或其他语言,正确的安全性,实现常见的Web应用程序组件(如会话或分页),生成站点地图,它们都被覆盖。还详细描述了应用程序模型,视图和模板的每个层的API。
然而,强大的力量带来了极大的复杂性。Django应用程序以其头重脚轻而闻名,具有许多移动部件。即使只有几条路线的简单Django应用程序也需要相当多的配置才能运行。如果你的工作只是设置几个简单的REST端点,Django几乎肯定是矫枉过正的。
Django也有它的怪癖。例如,页面模板不能使用callables。示例:可以将{{user.name}}作为模板中的组件传递,但不能传递{{user.get_name()}}。这是Django确保模板不会无意中做出令人讨厌的事情的方法之一,但如果你没有为它们做好准备,这些限制可能会很刺激。虽然有解决方法,但它们往往会对性能产生影响。
Django的核心是同步。但是,添加异步行为的一种方法是通过Django Channels项目。这个项目是官方的Django附加组件,它为Django添加了对连接和套接字的异步处理,同时保留了Django的编程习惯用法。
web2py
在Ruby世界中,Ruby on Rails是事实上的Web框架。DePaul大学计算机科学教授Massimo Di Pierro受到Rails的启发,用Python创建一个易于设置和使用的Web框架。结果是Web2py。
Web2py最大的吸引力在于其内置的开发环境。当设置Web2py实例时,将获得一个Web界面,实际上是一个在线Python应用程序编辑器,可以在其中配置应用程序的组件。这通常意味着创建模型,视图和控制器,每个都通过Python模块或HTML模板进行描述。一些示例应用程序随附Web2py。可以将它们分开来查看它们的工作方式,或将它们用作启动器模板来创建自己的应用程序。
开发人员通常只需下载源代码并使用它来部署Web2py。但对于Windows或MacOS上技术含量较低的用户,Web2py的创建者提供的版本基本上是独立服务器。下载,解压缩并运行其中一个版本,将拥有一个内置Web2py预配置副本的本地Web服务器。这是一个很好的方法来创建一个Web2py应用程序,然后可以部署其他地方。
Web2py的Web界面是使用Bootstrap 2.16.1构建的,因此它易于操作并且易于导航。浏览器内编辑器不能替代完整的IDE,但它配备了有用的辅助工具,如行编号和Python语法高亮(包括自动缩进)。还包括一个Python shell的快速Web界面,因此如果需要,可以从命令行与Web2py交互,这对专家来说是一个很好的让步。
Web2py中使用的数据抽象系统与Django的ORM和受其启发的其他ORM(例如Peewee)略有不同。这些系统使用Python类来定义模型,在Web2py中,使用构造函数(如define_table)来实例化模型。这些差异中的大部分可能只会对那些已经有过经验并且开始使用另一个的人产生震动;他们对新人来说同样复杂。将Web2py连接到数据提供者可能不会遇到任何麻烦,因为它几乎涉及现有的每个主要数据库。
一个真正有用的数据库相关功能是生成模型图的能力,更好地可视化模型之间的相互关系。但是,需要安装pygraphviz库才能启用该功能。
Web2py通过对jQuery和AJAX的集成支持,提供许多其他专业级组件:国际化功能,多种缓存方法,访问控制和授权,甚至前端效果(例如,表单中的日期选择器)。虽然不允许使用中间件来替换核心Web2py功能,但也包括外部和内部中间件的挂钩。
Web2py的一个重要限制是它仅与Python 2.x兼容。首先,这意味着Web2py无法使用Python 3的异步语法。如果你依赖于Python 3独有的外部库,那么你就不走运了。但是,正在开展使Web2py Python 3兼容的工作,并且在撰写本文时它已接近完成。
毫无疑问,Web2py的文档被称为“书”。首先,它涵盖了Web2py,Python以及用于这两者的部署环境的大量材料。其次,它以高度可访问的叙事风格书写。第三,它深入讨论了常见的应用程序构建方案。例如,有一整章使用jQuery(与Web2Py捆绑在一起)来构建AJAX应用程序。
Weppy
Weppy感觉就像Flask的简约风格和Django的完整性之间的中间标记。虽然开发Weppy应用程序具有Flash的直接性,但Weppy具有Django中的许多功能,如数据层和身份验证。因此,Weppy适用于从极其简单到适度复杂的应用程序。
乍一看,Weppy代码看起来很像Flask或Bottle代码。启动和运行基本的单路网站需要很少的指示。路径可以通过函数装饰器(简单方法)或以编程方式描述,并且这样做的语法与Flask/Bottle密切相关。除了语法的微小变化外,模板的工作方式大致相同。
Weppy与其他框架形成鲜明对比,包括它们仅作为插件或附加组件包含的一些功能。例如,Flask和Bottle都没有内置的ORM或数据管理系统。Weppy包含一个ORM,虽然它是基于pyDAL项目而不是更受欢迎的SQLAlchemy。Weppy甚至支持模式迁移,Django支持模式迁移作为其ORM的一部分(同样,Django的迁移系统也更加自动化)。虽然Weppy有一个扩展机制,但官方批准的附加组件列表很小,远小于Flask的扩展目录。
像Weppy这样的轻量级框架通常用于构建RESTful API,而Weppy则为此配备了便利功能。在路由上放置一个@service修饰器,返回的数据将自动格式化为选择的JSON或XML。
Weppy包含的其他功能更符合更大的框架,但它们是在没有批量的情况下实现的。示例:数据验证机制,表单处理,响应缓存和用户验证。在所有这些情况下,Weppy采取“恰到好处”的方法。提供的功能并不像在Django大小的框架中那样完整,但开发人员不需要投入大量精力来使它们变得有用,并且它们可以在事后得到扩展。
Weppy中发现的另一个通常与更重量级框架相关的功能是国际化支持。模板中的字符串可以根据应用程序提供的区域设置文件进行翻译,这些文件是简单的Python字典。也可以通过解析浏览器请求(即Accept-Language HTTP标头)或将翻译绑定到特定路由来设置语言选择。
Weppy的文档与框架本身具有相同的风格。它干净,可读,并且被人类消费。除了通常的“hello world”应用程序示例之外,它还包含一个很好的演练教程,可以让你创建一个微博系统作为初学者项目。
Weppy的长期计划包括支持异步和套接字作为低级一流实体。 Weppy的开发人员计划在2.0版本中引入这些功能,然后要求所有未来版本的Weppy使用Python 3.7或更高版本。
Zope2
Zope不适用于简单的RESTful API(每Bottle或Flask),甚至不适用于具有交互性的基本网站(à la Django)。相反,它意味着是一个完整的企业级应用程序服务器堆栈,类似于Java产品。该文档将该框架描述为“对组件开发人员,整合者和Web设计人员最有用。”一个主要的第三方产品Plone CMS使用Zope作为其基础,并作为Zope持续开发的主要驱动力。
Zope通过从Web获取请求,将请求的参数与内部对象数据库(ZODB)匹配,并使用请求的GET或POST参数执行该对象来工作。无论从对象返回什么,都会返回给客户端。 Zope使用此数据库对象系统来简化任务,例如分配粒度对象权限,为对象提供继承层次结构,以及处理数据库对象的事务和回滚。
由于Zope的尺寸和复杂性,安装需要一些工作;这不是简单地将源解压缩到项目子文件夹中的问题。一些设置过程包括编译C模块,因此在Windows上安装很棘手。自2010年以来,Zope的预打包Windows二进制文件尚未更新,并且围绕它们的文档状态使得很难确定设置的最佳实践。但是,实际框架的文档非常好。 Zope2 Book是一本非常详细的纲要。
当启动Zope并连接到服务器时,将看到Web UI,可以在其中创建和编辑ZODB对象。对象采用三种基本角色之一:内容,逻辑和表示,并且可以包含文档(基本上,任何具有MIME类型的文件),Python脚本和HTML模板。
模板可以是两种类型之一:新的和更灵活的Zope页面模板(ZPT)系统,或旧的和更基本的DTML标记系统。ZPT使用HTML标记中的属性来指示数据的放置位置,从而可以更轻松地使用传统的HTML工具设计模板。但是ZPT语法需要一些时间来习惯。
Zope声称其面向对象方法的优点之一是系统中的每个操作,无论它作用于何种对象,都由事务封装。因此,如果删除存储在Zope数据库中的文件或对一段代码进行破坏性更改,则只需回滚执行它的操作。缺点是很难在这样的代码库上使用像Git这样的现代源代码控制工具,这意味着你将数据放在Zope的自定义数据库工具的支配下。请注意,可以将MySQL之类的外部数据库连接到Zope应用程序,但这主要用于托管应用程序数据,而不是替换ZODB。
与这里讨论的许多较小的,更灵活的框架相比,Zope的遗留和大小转化为许多缺点。最大的缺点是Zope只能在Python 2.x下运行,所以不能利用Python 3库或异步语法,尽管正在努力解决这个问题。 (Zope 4仍处于测试阶段,包括Python 3支持以及更多支持。)
轻量级的Python Web框架
Bottle
Bottle可以被认为是一种迷你烧瓶,因为它比其他“微框架”更加紧凑和简洁。由于其占地面积最小,Bottle非常适合包含在其他项目中或快速交付REST API等小型项目。
Bottle的整个代码库适合单个文件,并且绝对没有外部依赖性。即便如此,Bottle还配备了足够的功能来构建常见的Web应用程序,而无需依赖外部帮助。
Bottle中的路由系统将URL映射到函数,其语法与Flask几乎完全相同。也不仅限于硬连线路径;可以动态创建它们。可以通过Bottle框架中的对象访问和操作请求和响应数据,cookie,查询变量,来自POST操作的表单数据,HTTP标头和文件上载。
每项功能都经过精心细致的实施。例如,使用文件上载,如果文件的命名约定与目标文件系统冲突(例如Windows上的名称中的斜杠),则不必重命名该文件;瓶子可以帮到你。
Bottle包含自己的简单HTML模板引擎。同样,虽然很小,但它已经装配好了必需品。默认情况下,模板中包含的变量使用安全HTML呈现;你必须指出哪些变量可以安全地从字面上重现。如果更换掉模板引擎并使用另一个模板引擎,例如Jinja2,那么Bottle可以帮助轻松完成。我其实喜欢与Bottle捆绑的简单模板系统;它的语法不起眼,它允许混合代码和模板文本而不会有不适当的困难。
Bottle甚至支持多个服务器后端。它配备了自己的内置miniserver以进行快速测试,但可以支持各种兼容WSGI的HTTP服务器,并在需要时可以回退到普通的旧CGI。
Bottle不需要像其他框架那样多的文档,但文档绝不是吝啬。所有关键的东西都适合单个(尽管很长)的网页。除此之外,还可以找到每个API的完整文档,如何在各种基础架构上进行部署的示例,内置模板语言的解释以及一系列常见配方。
与Flask一样,可以手动或通过编写补充瓶的插件扩展Bottle的功能。 Bottle插件列表远不及Flask的大小,但有一些有用的部分,例如与各种数据库层的集成和基本的用户身份验证。对于异步支持,Bottle可以使用异步运行的现有服务器适配器之一,例如aiohttp/uvloop。
Bottle极简主义的一个后果是有些功能根本就不存在。不支持表单验证,包括CSRF保护等功能。如果要构建支持高度用户交互的Web应用程序,则需要自己添加它们。
CherryPy
CherryPy已经存在了超过10年,但并没有失去最初区分它的极简主义和优雅。
这个框架的前提是,除了只包含为web页面提供服务所需的少量内容外,它应该尽可能地让人感觉它不像“web框架”,而是像任何其他类型的Python应用程序一样。根据文件显示,Hulu和Netflix等网站在制作中使用了CherryPy,这可能是因为该框架提供了一个高度低调的基础。
CherryPy可以将Web应用程序与核心逻辑区分开来。要将应用程序的功能映射到CherryPy提供的URL或路由,需要创建一个类,其中对象的名称空间直接映射到您要提供的URL;例如,网站的根由名为“index”的函数提供。传递给这些函数的参数用于处理由GET或POST方法提供的变量。
CherryPy包含的位用作低级构建块。包括会话标识符和cookie处理,但不包括HTML模板。像Bottle一样,CherryPy提供了一种将路由映射到磁盘上的目录以供静态文件服务的方法。
建议通过WTForms库进行扩展。 通过第三方扩展程序提供。
CherryPy通常会遵循现有的第三方库来支持某个功能,而不是尝试本机提供它。 例如,CherryPy不直接支持WebSocket应用程序,而是通过ws4py库支持。
CherryPy的文档包含一个方便的教程,介绍了该程序的各个方面。与其他框架教程不同,它不会引导完成一个完整的端到端应用程序,但它仍然有用。这些文档提供了有关各种场景中部署的方便说明,包括虚拟主机,通过Apache和Nginx的反向代理以及许多其他方案。
CherryPy在引擎下使用池化线程,更好地支持多线程服务器适配器。如果想尝试其他方法,CherryPy的非官方第三方分支交换asyncio协程而不是线程。
Falcon
如果正在构建基于REST的API而不是其他任何东西,那么Falcon提供的绝对必要。它的设计精简而快速,几乎没有标准库之外的依赖关系。
Falcon获得“轻薄”标签的原因很大一部分与框架中的代码行数无关。这是因为Falcon在应用程序上几乎没有任何结构。Falcon应用程序所要做的就是指出哪些函数映射到哪些API端点。从给定端点返回JSON只需设置路由并通过Python标准库中的json.dumps函数从中返回数据。对Python 3的async的支持尚未落入Falcon,但正在努力实现这一目标。
Falcon还采用了理智的开箱即用默认设置,因此安装时几乎不需要修改。例如,对于未明确声明的任何路由,默认情况下会引发404。如果要将错误返回给客户端,可以引发与框架捆绑在一起的许多库存异常中的一个(例如HTTPBadRequest)或使用泛型falcon.HTTPError异常。如果需要为给定路线进行预处理或后处理,Falcon也会为这些路径提供挂钩。
Falcon对API的关注意味着用传统的HTML用户界面构建Web应用程序几乎没有。例如,表单处理功能和CSRF保护工具几乎不存在。也就是说,Falcon提供了优雅的选项来扩展其功能,因此可以构建更复杂的项目。除了上面提到的挂钩机制之外,还可以找到一个用于创建中间件的界面,该界面可用于包装所有Falcon的API。
Falcon的文档与其他框架相比比较细长,但仅仅因为它的覆盖范围较小。用户指南包括所有主要功能的正式逐步演练,以及一个快速入门部分,可让您查看带或不带注释的示例代码。
Flask
关于Python中的Web框架的大多数讨论都是从Flask开始提到的,并且有充分的理由。 Flask是一个成熟的,易于理解的框架,广泛使用且非常稳定。使用Flask进行轻量级Web项目或基本REST API几乎不可能出错,但如果试图构建更大的东西,将面临繁重的工作。
Flask的核心吸引力在于其进入门槛低。一个基本的“hello world”Flask应用程序可以在少于10行的Python中设置。广泛使用的HTML模板系统Jinja2附带了使渲染文本变得容易的框架,但是Jinja2可以换成任何数量的其他模板引擎(例如Mustache),或者可以自己动手。
简洁的名称,Flask默认省略了许多细节。例如,它没有开箱即用的数据层或ORM,也没有类似表单验证的规定。但是,它可以通过扩展进行扩展,其中有几十个,包括许多常见用例,如缓存,表单处理和验证,数据库连接等。这种默认设计允许开始设计具有绝对最小功能的Flask应用程序,然后仅在需要时将所需的部分分层。
Flask的文档和蔼可亲,易于阅读。快速入门文档非常出色地帮助启动和运行,同时还解释了为简单的Flask应用程序所做的默认选择的重要性,并且API文档充满了如何使用所有内容的良好示例。同样优秀的是“片段”的集合,这些片段是如何使用Flask完成特定任务的快速和肮脏的示例,例如如果存在如何返回对象,如果不存在则返回404错误。
Flask在2018年早些时候发布了它的里程碑1.0版本,Python 2.6和Python 3.3是支持的最低版本,并且它的许多行为最终都是一成不变的。Flask没有明确支持Python的异步语法,但是为了满足这种需求,已经剥离了一个名为Quart的与Flask相关的API兼容变体。
Pyramid
小而轻,Pyramid比Django更接近Flask甚至Falcon。因此,它非常适合于将现有Python代码公开为REST API,或者为开发人员完成大部分繁重任务的Web项目提供核心的任务。
描述Pyramid极简主义的一个好方法是“无策略”,这是在文档部分中使用的一个术语,用于讨论Pyramid如何与其他Web框架形成对比。你使用什么样的数据库或什么样的模板语言不是金字塔的关注点。
“Pyramid仅提供一种机制来映射URL以查看代码,”文档说,“以及一组用于调用这些视图的约定。可以自由地在您的应用程序中使用符合您需求的第三方组件。“
构建基本的Pyramid应用程序只需要很少的工作。与Bottle和Flask一样,Pyramid应用程序可以包含单个Python文件,除了框架本身的文件。一个简单的单路径API不需要十几行代码。其中大部分是来自... import语句和设置WSGI服务器的样板。
默认情况下,Pyramid包含Web应用程序中常见的几个项目,但它们是作为要拼接在一起的组件提供的,而不是完整的解决方案。例如,包括对用户会话的支持,它甚至还带有CSRF保护。但是对Django提供的用户帐户(例如登录或帐户管理)的支持不是交易的一部分。您必须自己滚动或通过插件添加它。表单处理和数据库连接也是如此。
Pyramid避免过于极小的一种方法是通过提供从Pyramid项目制作模板的方法来重用或重新使用先前的工作。这些模板,即Scaffolds,生成一个带有简单路由和一些入门HTML / CSS模板的Pyramid应用程序。默认情况下,Pyramid包含的支架包括一个示例启动项目和一个通过常用的Python库SQLAlchemy连接到数据库的项目。
Pyramid在测试和调试工具方面同样细长。在Pyramid应用程序中捆绑debugtoolbar扩展,将在应用程序生成的每个网页上获得一个可点击图标,该图标生成有关应用程序执行的详细信息,包括发生错误时的详细回溯。还存在记录和单元测试,即使从这个轻量级的框架中排除两个看起来也很愚蠢的项目。
Pyramid的文档很棒。除了快速浏览基础知识和教程式演练之外,还可以找到一组社区贡献的教程,用于构建各种项目和常用食谱的烹饪手册。后者包括针对大量目标环境的部署技术,从Google App Engine到Nginx。
Pyramid支持Python 2和Python 3,但不使用Python 3的异步语法。有关如何在Pyramid中利用异步的线索,请参阅aiopyramid项目,其中包括用于异步驱动的“hello world”应用程序的脚手架。
Tornado
Tornado是针对特定用例的另一个小框架。Tornado专为构建异步网络应用程序而设计,非常适合创建同时打开大量网络连接并使其保持活动状态的服务,即涉及WebSockets或长轮询的任何内容。
像Bottle或Falcon一样,Tornado省略了与其核心目的无关的特征。例如,Tornado有一个内置的模板系统,用于生成输出(以HTML或其他方式)和国际化,表单处理,cookie设置,用户身份验证和CSRF保护的机制。但是它省略了类似于表单验证和ORM的功能,它们更适合面向用户的Web应用程序。
Tornado擅长为需要严密控制异步网络细节的应用程序提供基础架构。例如,Tornado不仅提供内置的异步HTTP服务器,还提供异步HTTP客户端。因此,Tornado非常适合构建应用程序,例如Web scraper或bot,它们并行查询其他站点并对返回的数据进行操作。
如果正在尝试创建一个使用HTTP以外的协议的应用程序,Tornado会提供帮助。它提供对DNS解析器以及第三方认证服务等实用程序的低级TCP连接和套接字的访问,并支持通过WSGI标准与其他框架进行互操作。文档很小但不稀疏,包含了如何完成所有这些的大量示例。
Tornado既利用并补充了Python的异步行为本机功能。如果使用的是Python 3.5,Tornado支持内置的异步和等待关键字,它们可以为应用程序提供速度提升。对于早期版本的Python,可以使用yield语句。在任何一种情况下,都可以使用期货或回调来处理对事件的响应。
Tornado 5.0改进了与Python的本机异步功能的集成。因此不再支持Python 3.3,并且Python 3.5用户必须使用Python 3.5.2或更高版本。 Tornado 6.0将需要Python 3.5及更高版本,并将完全放弃Python 2支持。
文档描述为“类BSD”.由同一作者通过单独的库提供。 支持SQLAlchemy作为标准ORM但不包括在内。 Tornado wiki中提供的链接。可通过第三方扩展程序获得。
Tornado还提供了一个同步原语库,信号量,锁等,以协调异步协程之间的事件。请注意,与Python解释器本身一样,Tornado通常运行单线程,因此这些原语与其线程名称不同。 但是,如果想在并行进程中运行Tornado以利用多个套接字和内核,那么可以使用这些工具。
Tornado的文档涵盖了框架中的每个主要概念以及模型中的所有主要API。 虽然它包含一个示例应用程序(网络抓取工具),但它主要用于演示Tornado的排队模块。
Web.py
Web.py最初是由已故的Aaron Swartz创建的,并被用作Reddit的原始基础。尽管Reddit可能已经从Web.py转移,但Web.py继续由其他人维护,主要是Anand Chitipothu。在范围和设计上,Web.py类似于Bottle和Flask;你可以把它当作一个基本的骨架,然后在它上面构建,而不会感觉太受限制。
要调用基本的Web.py实例,需要做的就是传递一个URL和函数映射列表。 URL可以包含带有捕获参数的正则表达式,允许使用/users/RayB或/article/451等格式从URL中提取数据。 Bottle具有类似的机制,但也提供了确保参数符合某些标准的方法(例如,它们只能是整数)。
Web.py在很大程度上保持干净和朴素,因为它不会尝试承担其他机制更好处理的任务。例如,没有本机功能允许从Web.py堆栈提供静态内容;说明明智地建议改为通过Web服务器。相比之下,Bottle具有提供静态内容的本机功能,尽管它是可选的。 Web.py还包括cookie和会话管理,甚至还有一个简单的输出缓存。
Web.py有一个HTML模板系统;它是非常基本的,但允许if/then/else逻辑。更复杂,更有用的是Web.py的动态生成HTML表单的系统,具有CSS样式的类属性和基本的表单验证机制。如果希望使用以编程方式生成的表单(例如基本数据库资源管理器)生成应用程序,这将非常方便。
Web.py的文档与框架本身一样小,但它并没有提供相关的示例。 “cookbook”部分(多种语言,不低于)演示了许多常见用例(提供静态内容,逐步传输大型文件等)。甚至还有一个使用该框架构建的真实Web应用程序库,其中许多都带有源代码。
请注意,Web.py并未像其他框架一样保持与Python 3兼容性的最新状态。这不仅意味着缺乏对异步语法的支持,还意味着缺少对已弃用的函数的错误。此外,目前尚不清楚维护者是否有计划在Python 2到达其支持生命周期结束后保持Web.py的最新状态。
Wheezy.web
Wheezy.web是Web框架的Flask/Bottle/Pyramid模型:小巧轻便,专注于提供高速和高并发性。这个功能集的核心是小的,但它的创建者已经为它配备了各种必备功能。
谈论Wheezy.web作为单一产品有点误导。Wheezy.web将同一作者创建的其他几个库粘合在一起,每个库根据希望应用程序的操作提供不同的服务。例如,Wheezy.http库被Wheezy.web大量用于许多基本行为,但除非应用程序必须执行用户身份验证,否则不需要Wheezy.security库。
这种库集合方法意味着使用Wheezy开发的最简单方法是从PyPI安装它或使用easy_install来收集所有相关的包。我在Python 3.51中使用easy_install时遇到了问题,但它在Python 2.7中运行良好。
Wheezy.web的核心主要是将路由映射到函数和处理重定向,但它配备了一些其他有用的功能。例如,使用@secure装饰器标记的任何路由将仅接受HTTPS请求,并且如果进行HTTP连接尝试将重定向到HTTPS。另一个核心添加是中间件,以便可以自定义路径路由和HTTP错误。
Wheezy的其他库涵盖了一组相当丰富的用例。Wheezy.validation可以帮助确保提交的数据满足特定条件,例如,用户名或密码满足长度或复杂性要求。Wheezy.caching允许缓存未更改的响应以加速处理,Wheezy.captcha与Python的PIL/Pillow图像库集成以生成验证码。对于国际化,它与标准GNU gettext实用程序集成。
核心Wheezy.web框架不包含模板引擎。如果需要做的不仅仅是返回纯文本或JSON,可以添加Wheezy.template引擎或连接许多第三方引擎,如Jinja2和Mako。 Wheezy.web也省略了ORM; Wheezy文档中的示例通过手动SQL字符串使用SQLite。
使用Wheezy构建应用程序需要比使用Flask或Bottle更多的样板,但不要过分;其中大部分涉及设置路线和中间件,这些东西可以在不费力的情况下抽象出来。Wheezy的文档中详细解释了这些细节,其中包括“创建留言簿”教程,但其他方面则是关于奖金的。
Wheezy的开发似乎已经停滞不前,因为该项目的最后一次提交都记录在2015年。这对于保持与新Python功能的兼容性并不是好兆头。
权衡Python Web框架选项
选择Python Web框架与选择任何其他软件工具没什么不同:它完全是为了适应目标和适应自己的开发习惯和偏好。
如果更喜欢minimal,只需创建一个REST API或在Web框架中包装现有的Python代码,这里描述的许多Python框架都非常适合你的需求。在这方面,Flask和Bottle是很好的选择。由于其紧凑性,Bottle特别适合包含在其他项目中。
Pyramid和CherryPy的项目结构相对较少,因此它们对于快速包装现有代码非常有用。在这方面,Falcon和Tornado更加微弱。它们的开销很小,但也缺乏更强大的Web应用程序所需的更重的工具。 Web.py是涉及用户交互(例如表单提交)的应用程序的快速起点。 Wheezy.web和它的库允许按照自己想要的功能去做。
对于具有更高端需求的开发人员而言,Django是最好的起点之一,不仅因为其拥有丰富的开箱即用组件,而且庞大的用户社区多年来取得了巨大成功。如果你不需要这样的完整性,Weppy是一个很好的折衷方案,因为它比更小的框架具有更多扩展的功能集。
最后,虽然CubicWeb和Zope2仅提供整个开发环境而不是框架,但它们都是头重脚轻和特殊的。使用它们是以学习它们的特性为代价的。
原文链接:
https://www.infoworld.com/article/3105502/python/review-13-python-web-frameworks-compared.html