Python 既像一个有趣的玩具,又像一个强大的工具。它可以被用来执行各种各样的操作,这使得它在不同领域都非常受欢迎。
无论是业余爱好者、科学家还是架构师,Python 都深受他们的喜爱。
它入门简单,却又具备构建大型复杂系统的高级抽象和元编程能力。此外,Python 拥有大量的库,几乎可以满足任何需求。当然,在并发性和强类型方面存在一些限制,但这些问题都有相应的解决方案。
本文将介绍一些在构建各种规模的 Web 应用程序时,非常优秀的 Python 框架。
Django
Django 框架经受住了时间的考验,已成为 Python 社区中首选的 Web 框架。 如果你随便问一位 Python 开发人员,在开发 Web 应用时他们会选择什么,他们很可能会不假思索地选择 Django,就像 Ruby 开发人员选择 Rails 一样。
这并非没有原因。 正如其标语所述,Django 是一个“为有截止日期的完美主义者设计的 Web 框架”。 它是一个所谓的“自带电池”的框架(就像 Python 本身是一种自带电池的语言),提供了所有常用的开箱即用功能。
这些功能使得 Django 大大缩短了开发时间:
- 一个方便且易于使用的 ORM(对象关系映射),由框架自动生成并应用迁移。
- 用于根据你的模型自动生成管理面板的脚手架。
- 对 cookies、会话、中间件、模板等的支持。
- 自动应用 XSS 防护、CRSF 防护等安全功能。
- 几乎适用于所有数据库(即使没有官方支持,也很容易找到适配器)。
- 对地理数据和空间查询的一流支持 GeoDjango。
此外还有许多其他的优点。 总而言之,Django 是一个功能强大且用户友好的 Web 框架。
那么,Django 适合你吗?
答案是肯定的。
无论是快速原型开发还是企业级应用规划,Django 都是一个非常不错的选择。你可能会遇到的唯一问题是框架的结构。因为 Django 致力于让开发过程快速而简单,它会强制开发者采用其结构(一种叫做“约定优于配置”的概念),你可能并不总是赞同。比如,如果你想用其他组件(例如 SQL Alchemy)替换 Django ORM,那可能会有些麻烦。
有兴趣成为一名使用 Django 和 Python 的全栈开发人员吗? 可以看看这个 很棒的在线课程。
Flask
尽管 Django 几乎占据了 Python Web 开发领域的全部关注,但 Flask 也是一个强大的竞争者。
与 Django 不同,Flask 是一个“微框架”,这意味着它专注于提供最基本的功能,而剩下的则由你来处理。这种“由你决定”的做法可能会令人沮丧,也可能令人欣喜,具体取决于你的目标。对于那些了解自己在做什么,并希望通过选择自己喜欢的组件来精心构建 Web 应用程序的人来说,Flask 是一个非常好的选择。
Flask 提供以下功能:
- 路由、模板、会话管理和其他有用的功能。
- 完全支持单元测试。
- 最小的可插拔架构。
- 一流的 REST 支持。
- 支持蓝图,Flask 独特的微型 Web 应用程序架构。
- 可以选择用于 ORM、迁移等的包。
- 灵活的应用程序结构——将文件放在你认为最合适的地方。
- 静态文件服务。
- 符合 WGSI 标准。
那么,Flask 适合你吗?
如前所述,Flask 是一个最小的 Web 框架,所有内容都被分解为可以替换的独立组件。 如果你急于构建原型,那么你可能会花费大量时间在数据库、文件夹结构、路由等问题上做出繁琐的决定,这可能会适得其反。Flask 最适合用于稳定、严肃的中大型项目,尤其是 REST API 的开发。
Bottle
如果你觉得 Flask 的方法还不够简洁,并且仍然想要更多的控制权,那么可以考虑一下 Bottle。
Bottle 更加精简,以至于它唯一的依赖项就是 Python 标准库。这意味着你不需要通过 pip 安装任何东西,尽管你可能很快就会需要这样做。 这也是 Bottle 在某些人眼中脱颖而出的原因:
- 单文件部署。你的整个应用程序都在一个 “.py” 文件中。
- 没有外部依赖项。只要你安装了合适的 Python 版本,就可以直接开始使用。
- 提供自己的模板引擎,也可以使用 Jinja2、Mako 或 Cheetah。
- 支持表单、标题、cookies 和文件上传。
- 内置网络服务器,可以轻松替换。
那么,Bottle 适合你吗?
如果你正在开发一个非常小,并且没有特殊要求的应用程序(例如少于 500 行代码),那么 Bottle 可能是一个不错的选择。这是一种完全可行的 Web 应用程序创建方式,但在实践中,你会发现 Bottle 给你带来的麻烦多于帮助。原因是现实世界总是在不断变化。 新的需求将会不断涌现。 到那时,将所有内容放在一个文件中就会变得非常不方便。
另外,如果你觉得 Bottle 和 Flask 很相似,那么你是对的。关于 合并 这两个框架的建议可以追溯到 2012 年,甚至 Flask 的创建者 Armin 也同意这一点。 然而,Bottle 的创建者 Marcel 坚持认为,单文件方法具有其独特的优势,两者应该保持分离。
Zope
Zope 的解释有些复杂,但我会尽力尝试。是的,它是一个 Web 框架,可用于构建各种规模的应用程序,但这还不是全部。Zope 更像是一个平台,由一系列基于 Zope 理念创建并由 Zope Corporation 维护的工具(包括 Web 框架)组成。
Zope 有一些适合企业应用程序开发的有趣组件和特性:
- 用于配置大型应用程序的组件注册和发现架构。
- ZODB—一个(唯一的)Python 对象数据库,用于本地存储对象。
- 内容管理系统的成熟框架和标准。
- 一组 Web 应用程序框架——虽然官方框架仍然称为 Zope,但已经有一些新的框架(如 Grok)建立在其之上。
- 软件开发、发布和维护的严格标准。
那么,Zope 适合你吗?
如果你正在寻找一个高度结构化的环境来构建真正的大型应用程序,那么 Zope 是一个不错的选择。但是,你也可能会遇到一些问题。尽管 Zope 在不断发展,但其社区规模确实很小,以至于许多 Python 开发人员甚至都没有听说过它。查找教程和相关文档可能会很困难,因此你需要做好大量研究的准备(尽管社区非常乐于助人!)。此外,你遇到的 Python 开发人员可能并不想学习 Zope,认为这会“稀释”他们的技能。
TurboGears
TurboGears 是一个高度灵活的框架,拥有真正可组合的架构。它是一个可以根据你的需要进行扩展的框架,你可以用它来构建单文件应用程序或多租户的大型系统。
TurboGears 有一些优雅的特性,其中一些要么不存在于流行的框架(如 Django)中,要么难以构建:
- 对多个数据库的一流支持。
- 多数据库事务。
- 高度模块化——从单个文件开始,并根据需要扩展。
- 强大的 ORM(SQLAlchemy,比 Django 的 ORM 更成熟、更强大)。
- 基于 WSGI 规范的可插拔架构。
- 内置支持数据库分片。
- 一个功能驱动的接口,而不是深层次、严格的面向对象的层次结构。
那么,TurboGears 适合你吗?
如果你希望快乐地开发,并且需要一个经过测试的、成熟的、稳健的框架来远离那些“很棒的下一代”框架的宣传,那么 TurboGears 是一个非常合适的选择。 它在社区中备受推崇,并拥有完整且全面的文档。当然,TurboGears 并非固执己见,这意味着初始设置和配置时间可能较长,但它是企业级应用程序开发的理想框架。
Web2py
Web2py 最初是一个业余爱好项目,于 2007 年发布。它的目标是让 Web 开发变得简单易用,人人皆可上手。
因此,Web2py 将零依赖的方法发挥到了极致——它没有任何依赖项,无需安装,并且包含一个基于 Web 的全功能编辑器,可用于开发、数据库管理和部署。
你可以将它看作是一个完整的开发环境,而不仅仅是一个框架,更像是 Android Studio。Web2py 的一些优点:
- 几乎没有学习曲线。
- 最小的核心(只有 12 个对象),甚至可以记住!
- 纯 Python 模板。
- 防止 XSS、CSRF 和其他攻击。
- 令人愉悦且一致的 API。
那么,Web2py 适合你吗?
Web2py 是一个稳定且有趣的框架,但很难推荐它来替代其他选项,如 Django 或 Flask。 它几乎不需要任何设置,但是单元测试的支持并不理想。 也就是说,你可能会喜欢它的代码 API 以及框架提供的整体体验,尤其是在构建 REST API 时。
CherryPy
CherryPy 是另一个微框架,旨在提供基本的框架功能,让你能够快速开始开发。
虽然它与其他微框架(如 Flask)相似,但 CherryPy 也有一些不同之处:
- 它包含一个内置的多线程服务器(这是 Flask 的一个愿望清单)。
- 一个(单个)Web 服务器可以托管多个应用程序!
- 你可以将应用程序作为 WSGI 应用程序(与其他 WSGI 应用程序交互)或普通 HTTP 服务器运行(性能更好)。
- 对分析和单元测试的一流支持。
- 可以在 PyPy(对于真正的性能爱好者)、Jython 甚至 Android 上运行。
CherryPy 可以完成所有这些,以及你期望从 Web 框架中获得的常见功能。
那么,CherryPy 适合你吗?
如果你主要构建 RESTful 服务,那么 CherryPy 是一个比 Flask 更有力的竞争者。它是一个已经存在了十年的框架,非常成熟,适用于小型和大型应用程序。
Sanic
Node.js 的兴起及其异步编程模型让许多社区感到落后,包括 Python。作为回应,一系列异步 Web 框架开始崭露头角,Sanic 就是其中之一。
Sanic 深受 Flask 的启发,在某种程度上,它借鉴了路由装饰器、蓝图和其他基本原理。他们也并不避讳承认这一点。如果你是 Flask 的粉丝,Sanic 提供的是真正的非阻塞 I/O,以达到 Node.js 应用程序的性能水平。换句话说,Sanic 就是支持 async/await 的 Flask!
与 CherryPy 相比,Sanic 具有令人难以置信的性能优势(想想它会如何碾压 Flask!)。请查看来自 Dataweave 的以下测试结果:
如你所见,一旦并发数超过每秒 50 个,CherryPy 就会几乎崩溃并出现很高的失败率。
那么,Sanic 适合你吗?
尽管 Sanic 的性能特点让其他框架相形见绌,但它可能不是你下一个项目的最佳选择。主要原因是缺少异步库。大多数现有的 Python 工具和库都是为单线程 CPython 版本编写的,没有考虑到高并发或异步操作。例如,如果你最喜欢的 ORM 不支持异步操作,那么使用 Sanic 的意义就大打折扣了。
出于成熟度和可用性方面的考虑,我们不再研究 Python 中的任何异步框架。
Masonite
不久前,我发现了这个框架,并且认为它是朝着正确方向迈出的一步。自从 2.0 版本发布以来,我觉得现在是时候给 Masonite 一些关注了。
简单来说,Masonite 是 Laravel(一个著名的 PHP 框架,如果你不知道的话)的 Python 版本。为什么这很重要?因为 Laravel 是基于 Ruby on Rails 的原则构建的,这两个框架一起允许非 Ruby 开发人员体验“Rails Way”的开发方式。
Laravel (以及一定程度上的 Rails) 开发人员会感觉宾至如归,并且可以立即上手。当我尝试使用 Masonite (我还提交了一两个问题,包括一个错误!) 时,我能够毫不费力地构建 REST API,因为我的 Laravel 肌肉记忆可以完成所有的事情。
作为一个“自带电池”的全栈框架,Masonite 提供了一些有趣的功能:
- 活动记录式的 ORM。
- 数据库迁移(与 Django 不同,它需要由开发人员手动创建)。
- 用于依赖注入的强大的 IoC 容器。
- 自己的 CLI(称为 “craft”)用于脚手架和运行任务。
- 一流的单元测试支持。
Masonite 最大的 “竞争对手” 是 Django,因为社区正在尽最大努力将该框架宣传为下一个简单且令人愉悦的选择。它是否会超越 Django 还有待时间验证(如果你问我的话,我认为它很有希望),如果你想比较这两者,可以查看 这里 和 这里 的讨论。
那么,Masonite 适合你吗?
与 Django 相比,Masonite 仍然是一个“婴儿”,因此无法推荐它来替代 Django。也就是说,如果你喜欢使用 Rails 方式(或 Laravel 方式)做事,那么你会欣赏 Masonite 提供的功能。 它非常适合快速构建需要预先配置所有内容并易于替换的原型。
结论
Python 中不乏各种规模的框架。虽然你可以为小型项目选择任何一个框架,但企业应用程序的需求对于许多框架来说难以满足。如果你问我,对于企业开发,我会考虑 Django (在某种程度上)、Zope 和 TurboGears。即使在这些框架中,我个人也更倾向于 TurboGears。
也就是说,任何合格的架构师都可以选择一个微框架并构建他们自己的架构。 这几乎就是在实践中发生的事情,这也解释了 Flask 和类似框架的成功。
如果你是初学者,那么 这个在线课程 对学习 Python 很有帮助。
接下来,可以探索一些用于构建 API 的专用 Python 框架。