如果您正在开发Web应用程序,并且选择了Python作为构建该应用程序的语言,那是明智之举。 Python的成熟开发,强大的库以及在现实世界中的广泛应用,使它成为Web开发的捷径。
现在来了困难的部分:选择许多可用的Python Web框架之一。 不仅数字还在增长,而且很难找到最适合您的用例的数字。 如果您要构建一个快速而又肮脏的REST API,那么您将不需要使用带有用户登录名,表单验证和上传处理功能的完整的面向用户的应用程序所需的管线和接线。
在本综述中,我们将研究13个部署最广泛的Python 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)提供了更简约的方法,为了简单易用而交易了体积和完整性。
让我们从重量级人物开始。
CubicWeb被称为“一种支持重用和面向对象设计的语义Web应用程序框架”。 这是一个耐人寻味的系统,如由Rick Grehan指出,当他看着它在2011年,强调利用抽象和所谓的代码可重用的构建模块,用于InfoWorld的背“立方体”,但也可能是过于抽象或者一些特殊的一些开发。
多维数据集是具有模式(数据模型),实体(编程逻辑)和视图的软件组件。 通过组装多个多维数据集,每个多维数据集执行各自的任务,可以通过重用自己的代码和其他代码来组成软件应用程序。
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版,Python 3支持已在CubicWeb中登陆 ,但Twisted之类的模块本身并未完全移植。
与Web2py一样,CubicWeb将其冗长的文档称为“书”。 花时间解释CubicWeb的不寻常方法,演示如何构建一些基本应用程序,包括API引用,并且总的来说要具体化。
自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不必创建自己的系统来跟踪用户帐户,会话,密码,登录/注销,管理员权限等,而本地具有这些功能。 它们可以按原样使用,也可以扩展为包含最少工作量的新用例。
立方网 | Django的 | Web2py | 韦皮 | Zope2 | |
---|---|---|---|---|---|
执照 | LGPL | BSD | LGPLv3 | BSD / LGPLv3 [1] | Zope公共许可证 |
本机HTML模板系统 | 是 | 是 | 是 | 是 | 是 |
本机ORM /数据管理 | 是 | 是 | 是 | 是 | 是 |
扩展库 | 是 | 是 | 是 | 是 | 是 |
表格验证 | 是 | 是 | 是 | 是 | 是的[2] |
跨站点请求伪造保护 | 是 | 是 | 是 | 是 | 是 |
用户管理/基于角色的访问 | 是 | 是 | 是 | 是 | 是 |
Python 3支持 | 是 | 是 | 没有 | 是 | 没有 |
数据模型的架构迁移 | 是 | 是 | 是 | 是 | 没有 |
响应缓存 | 没有 | 是 | 是 | 是 | 是 |
国际化支持 | 是 | 是 | 是 | 是 | 是 |
本机WebSocket支持 | 没有 | 否[3] | 是 | 没有 | 没有 |
互动开发环境 | 是 | 没有 | 是 | 没有 | 是 |
Django具有合理且安全的默认值,可帮助保护您的Web应用程序免受攻击。 当您在页面模板中放置变量(例如带有HTML或JavaScript的字符串)时,除非您明确将变量实例指定为安全实例,否则不会按实际方式显示内容。 这本身就减少了许多常见的跨站点脚本问题。 如果要执行表单验证,则可以使用从简单的CSRF保护到成熟的逐个字段验证机制(返回详细的错误反馈)的所有功能。
没有强大的文档来配合Django,那么丰富而广泛的功能就不好了。 Django的文档站点从多个角度深入研究了框架的各个方面。 使用Python 3或其他语言的版本,进行安全性保护,实现常见的Web应用程序组件(例如会话或分页),生成站点地图,均已涵盖。 还详细描述了应用程序每一层的API(模型,视图和模板)。
但是,强大的功能会带来极大的复杂性。 Django应用程序以重载着称,其中有许多活动部件。 即使是只有几个路由的简单Django应用,也需要大量配置才能运行。 如果您的工作只是建立几个简单的REST端点而已,那么Django肯定是多余的。
Django也有它的怪癖。 例如,页面模板不能使用可调用对象。 示例:您可以将{{user.name}}
作为模板中的组件传递,但不能传递{{user.name}}
{{user.get_name()}}
。 这是Django确保模板不会无意间做一些令人讨厌的事情的方法之一,但是如果您没有为模板做好准备,那么这些约束可能会变得棘手。 尽管有解决方法,但它们往往会损害性能。
Django的核心是同步的。 但是,添加异步行为的一种方法是使用Django Channels项目。 这个项目是Django的官方附加组件,它为Django添加了对连接和套接字的异步处理,同时保留了Django的编程习惯。
在Ruby世界中,Ruby on Rails是事实上的Web框架。 DePaul大学计算机科学教授Massimo Di Pierro受Rails启发,以Python创建了一个易于安装和使用的Web框架。 结果是Web2py 。
Web2py的最大吸引力在于其内置的开发环境。 设置Web2py实例时,会提供一个Web界面,实际上是一个在线Python应用程序编辑器,您可以在其中配置应用程序的组件。 这通常意味着创建模型,视图和控制器,每个模型,视图和控制器均通过Python模块或HTML模板进行描述。 Web2py提供了一些示例应用程序。 您可以将它们分开看看它们是如何工作的,或者将它们用作入门模板来创建自己的应用程序。
开发人员通常通过简单地下载Web2py的源代码并使用它来部署Web2py。 但是对于Windows或MacOS上技术含量较低的用户,Web2py的创建者提供的版本实质上是独立服务器。 下载,解压缩并运行其中一个版本,您将拥有一台本地Web服务器,其中内置了Web2py的预配置副本。这是一个很好的方法,可以帮助您创建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感觉介于Flask的最小简单性和Django的完整性之间。 虽然开发Weppy应用程序具有Flash的直接性,但Weppy拥有Django中发现的许多功能,例如数据层和身份验证。 因此,Weppy适用于从极其简单到中等复杂的应用程序。
乍一看,Weppy代码看起来很像Flask或Bottle代码。 只需很少的指导,即可建立和运行基本的单路线网站。 可以通过函数装饰器(简单的方法)或以编程方式描述路径,这样做的语法与Flask / Bottle紧密相关。 除了语法上的微小变化外,模板的工作原理大致相同。
Weppy通过包含仅作为插件或附加组件合并的某些功能与其他框架形成对比。 例如,Flask和Bottle都没有内置的ORM或数据管理系统。 Weppy包含一个ORM,尽管它是基于pyDAL项目而不是更流行的SQLAlchemy的ORM。 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或更高版本。
信息世界记分卡 |
本机功能 (20%)
|
管理 (20%)
|
安装 (20%)
|
文件 (20%)
|
安全性 (10%)
|
可扩展性 (10%)
|
总分 (100%)
|
---|---|---|---|---|---|---|---|
瓶0.12 | 8 | 10 | 10 | 8 | 7 | 7 | |
CherryPy 17.0.0 | 7 | 9 | 9 | 9 | 8 | 8 | |
立方网3.26.4 | 10 | 8 | 7 | 10 | 9 | 7 | |
Django 2.1 | 10 | 8 | 8 | 10 | 10 | 10 | |
猎鹰1.4.1 | 7 | 10 | 8 | 8 | 7 | 7 | |
烧瓶1.0.2 | 8 | 9 | 8 | 9 | 8 | 8 | |
金字塔1.9.2 | 8 | 8 | 8 | 10 | 9 | 7 | |
龙卷风4.3 | 8 | 9 | 9 | 8 | 8 | 7 | |
Web.py 0.39 | 8 | 8 | 10 | 8 | 9 | 8 | |
Web2py 2.16.1 | 10 | 9 | 7 | 10 | 9 | 8 | |
威百1.2.11 | 10 | 8 | 9 | 9 | 10 | 9 | |
Wheezy.web 0.1.485 | 9 | 9 | 8 | 8 | 8 | 8 | |
Zope2 2.13.24 | 10 | 8 | 7 | 9 | 9 | 9 |
From: https://www.infoworld.com/article/3105502/review-13-python-web-frameworks-compared.html