1.2. 重量级的Python Web框架

Python程序员有很多选择来创建Web应用程序和API; 常用的框架有 Django,Weppy,Bottle和Flask。 Python的开发成熟度,强大的库以及广泛的实际应用使其成为Web开发的强大工具。

先看一下重量级的框架。

1.2.1. CubicWeb

CubicWeb被称为“一个支持重用和面向对象设计的语义Web应用程序框架”。 这是一个有趣的系统,强调使用抽象和可重用的代码块称为“多维数据集”,但对于某些开发人员来说可能过于抽象或特殊。

多维数据集是具有模式(数据模型),实体(编程逻辑)和视图的软件组件。 通过组合多个立方体,每个立方体执行自己的任务,可以通过重用自己的代码和其他代码来编写软件应用程序。

CubicWeb的核心是提供每个Web应用程序使用的基本搭建材料:用于数据连接和存储的“存储库”;用于基本HTTP请求/响应和CRUD操作的“Web引擎”;以及用于建模数据的模式。 要设置和管理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框架的工具。

与Web2py一样,CubicWeb将其冗长的文档称为“书籍”。 它需要时间来解释CubicWeb的不寻常方法,演示如何构建一些基本应用程序,包括API引用,并且通常不会特定的方式。

1.2.2. Django

自Django首次出现以来已经有十年,它已经成为Python最广泛部署的用于创建Web应用程序的框架之一。 Django配备了你可能需要的大部分组件,因此它倾向于构建大型应用程序而不是小型应用程序。

Django吸引力的一个关键部分是部署速度。 因为它包含了开发普通Web应用程序所需的许多部分,所以可以快速行动。 路由,URL解析,数据库连接(包括ORM),表单验证,攻击保护和模板都是内置的。

将找到最常见的Web应用程序方案的构建块。 例如,用户管理可在大多数网站上找到,因此Django将其作为标准元素提供。 Django本身具有这些功能,而不必创建自己的系统来跟踪用户帐户,会话,密码,登录/注销,管理员权限等。 它们可以按原样使用或扩展,以包含最少量工作的新用例。

Django具有健全和安全的默认设置,有助于保护Web应用程序免受攻击。 将变量放在页面模板中时,例如带有HTML或JavaScript的字符串,除非明确将变量实例指定为安全,否则不会按字面意义呈现内容。 这本身就减少了许多常见的跨站脚本问题。 如果要执行表单验证,可以使用从简单的CSRF保护到返回详细错误反馈的完整逐个字段验证机制的所有内容。

如果没有强大的文档可以使用像Django那样丰富和广泛的功能。 Django的文档站点从多个角度深入研究框架的各个方面。 使用Python 3或其他语言,正确的安全性,实现常见的Web应用程序组件(如会话或分页),生成站点地图,它们都被覆盖。 还详细描述了应用程序模型,视图和模板的每个层的API。

然而,强大的力量带来了极大的复杂性。 Django应用程序以其头重脚轻而闻名,具有许多移动部件。 即使只有几条路线的简单Django应用程序也需要相当多的配置才能运行。 如果你的工作只是设置几个简单的REST端点,Django几乎肯定是矫枉过正的。

1.2.3. 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的文档被非常详尽,足够当作一本忆。 首先,它涵盖了Web2py,Python以及用于这两者的部署环境的大量材料。 其次,它以高度可访问的叙事风格书写。 第三,它深入讨论了常见的应用程序构建方案。 例如,有一整章使用jQuery(与Web2Py捆绑在一起)来构建AJAX应用程序。

1.2.4. 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的长期计划包括支持异步和套接字作为低级一流实体。

1.2.5. 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支持以及更多支持。)