65.9K
CodeProject 正在变化。 阅读更多。
Home

Django 和 Tornado:Python Web 框架

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (2投票s)

2013 年 8 月 28 日

CPOL

12分钟阅读

viewsIcon

37739

了解 Django 和 Tornado。

本文作者是 Michael D'Agosta,最初发表于 《Software Developer's Journal》2013 年 8 月刊。您可以在 SDJ 网站 上找到更多文章。 

引言

很久以前,只需将一些“服务器页面”与数据库连接起来,就可以拥有一个网站。如今,网络复杂且动态,需要大量基础设施才能让网站在互联网上活跃起来。幸运的是,没有人需要从头开始编写这一切,因为有许多语言的框架提供了构建网站所需的基础。

Web 框架的目的是提供所有应用程序都需要的一些通用功能。模型-视图-控制器 (MVC) 模式是 Web 应用程序开发的事实标准,因此框架通常会提供某种形式的数据库支持(模型)、URL 处理(控制器)和 HTML 模板(视图)。在本文中,我将介绍两种 Python 编程语言的 Web 框架:DjangoTornado。虽然两者都提供模型-视图-控制器架构,但它们在其他方面却截然不同。

Django 更成熟,功能更丰富,并为您处理了许多细节,因此您无需了解所有底层知识即可创建一个功能齐全的网站。它稳定、易于使用,拥有强大的社区和大量支持。但尽管有这些优点,由于其包罗万象的性质,在某些情况下它可能很难定制和排查问题。Tornado 更轻量级,功能较少,但运行速度更快,提供异步 ioloop 用于轮询/websocket 请求,以及各种 oauth 和社交媒体功能。由于它小巧快速,可以通过大量工作对其进行细致入微的定制。

Django 功能

Django 是一个一站式解决方案。Web 最基本的部分是 HTTP 请求。Django 控制器允许使用正则表达式匹配 URL,以调用正确的函数并处理传入的请求。与任何 Web 框架一样,您可以获得合理的默认请求和响应,并具有覆盖的能力。您可以确定 GET 或 POST 以及其他 Web 上下文,从而干净地分离代码。

如果您和大多数人或公司一样,您将希望从用户那里收集数据并将其存储在数据库中。这是 Django 可以通过其强大的默认值真正提供帮助的一个地方。它有一个表单生成器,允许您根据数据库字段定义表单,然后为您生成 html,并在 POST 提交时验证用户的数据。复杂的数据模型会读取您现有的数据库架构,或者为您创建一个,并生成代码将架构定义为软件对象。然后,您可以读取和设置属性,根据过滤器进行查询,并以类的层次结构中的对象形式考虑您的 sql 数据。然而,该系统的致命弱点是,如果您有特定的图形设计目标,则很难对其进行样式化。

模板系统提供了 MVC 的视图部分。您可以将变量分配给一个独立于 Python 代码的 html 模板,然后模板的值将被替换。这在当今相当普遍,Django 在这方面做得很好。您可以循环遍历列表和字典等可迭代对象,并调用函数。模板继承是一种简单而强大的定义标准页眉和页脚以及其他功能的方式,因此它们存在于每个页面上。但是,模板的渲染速度不是最快的,因此您应该计划额外的处理时间。

由于它是一个非常成熟的系统,Django 还拥有各种其他功能:用户身份验证、本地化、Unicode 处理,等等。如果您想要一个能够满足您可能需要的一切的框架,并且您没有足够的时间或技能来完成大量工作,那么 Django 对您来说是一个很棒的系统。正如他们所描述的,Django 是为有最后期限的完美主义者设计的 Web 框架。

Tornado 功能

Tornado 可能是功能齐全的 Python 框架中最精简、最强大的。它小巧而快速,同时满足了 MVC 框架的基本期望。更小也意味着更简单,因此您可以轻松地扩展框架本身并直接管理您网站的基本操作,例如 HTTP 处理和请求参数解析。它具有与 Django 类似的 URL 路由,但使用单独的类来处理每个请求。这使得为您的请求创建类层次结构成为可能,因此您可以将一系列页面粘合到一个父“流程”类中。巧妙地运用,您可以将这种方法发挥到极致。

数据库连接默认不再内置,但存在于名为 torndb 的独立包中。使用它,您可以轻松连接到 MySQL 并发出查询。没什么大不了的,它就是能用。返回的对象像字典一样工作,很多人认为没有比这更简单的了!您将需要创建自己的系统来管理连接和重试失败的查询,因此这是您使用 Tornado 进行额外工作的一个地方,而且它的工作方式完全符合您的要求。

模板系统的语法与 Django 非常相似,几乎可以互换:您可以使用模板继承、变量绑定、循环和本地化支持,就像使用 Django 一样。但它在底层代码更少的情况下执行速度更快。通过仔细地插入条件包含的文件,您还可以通过短路模板编译来提高速度。这是 Tornado 为您提供对系统内部的强大访问权限的另一个例子,以使其完全按照您的意愿进行。本地化和 Unicode 支持非常全面——您可以创建 csv 键/值对文件,并根据浏览器语言标头查找值。只要您以开放的方式设计您的系统,您就可以用多种语言快速执行您的整个网站。

Tornado 真正与众不同之处在于 IOLoop,这是一个异步软件库,直接与内核 EPoll、KQueue 和类似设施集成。这种编程风格也称为事件循环,它允许您的程序分离其流程控制,因此当您等待内核调度事件时,系统可以响应另一个 Web 请求。它类似于 Twisted Reactor 和 node.js,因为它基于事件循环而不是为每个请求fork一个新进程。您可以让用户的请求“挂起”,同时在其他地方执行某些操作,例如执行 Oauth、发布到社交媒体、进行 API 调用或抓取另一个网页。为了演示异步功能,Tornado 默认提供了一个 Web 聊天系统,该系统在一个进程上运行,并将成为后续代码示例的基础。

通过编码学习编程

既然您正在研究 Web 框架,我假设您可以安装 python 和相关包,并且通常可以编辑和运行源代码。话虽如此,学习编程的最佳方法是练习和遵循示例。所以,不多说了,让我们开始编写代码吧!我准备了一些示例来演示每个系统在 https://github.com/mdagosta/hello-sdj 的功能。

Django 示例

Django 有一个出色的教程,可以帮助您了解其功能的深度和广度,您可以在 https://docs.django.ac.cn/en/dev/intro/tutorial01/ 找到。它将指导您完成一个最小可行服务器的搭建……为了简洁起见,我将省略很多内容,而是创建一个最小功能程序。让我们创建一个网页集,允许用户通过 Web 发送电子邮件给我,并将消息存储在数据库中,而无需您运营一个基于 Web 的企业所需的所有额外功能。

安装 Django 后,您可以从 shell 运行其管理系统

%> django-admin.py startproject django_sdj
%> cd django_sdj
%> python manage.py runserver

在浏览器中访问 https://:8000,您应该会看到一个标准的欢迎页面。在您完成此操作后,请继续下一步。

为简单起见,我们将使用 sqlite 数据库,并让 Django 为我们配置它。将 settings.py 编辑为如下所示

  'ENGINE': 'django.db.backends.sqlite3', # 添加 'postgresql_psycopg2', 'mysql', 'sqlite3' 或 'oracle'。
  'NAME': 'django_sdj.sqlite3',

然后回到 shell,运行 django syncdb 并按照提示进行操作

%> python manage.py syncdb

在浏览器中访问 https://:8000 来检查它是否正常工作

接下来创建一个名为“hello”的 Django “应用程序”(在 Django 术语中与“项目”不同)

%> python manage.py startapp hello

然后编辑 settings.py 和 hello/models.py 来开始为您的应用程序添加实质内容。查看我在此处进行的的代码 diff:https://github.com/mdagosta/hello-sdj/commit/c8970ded6fc015f57278ad128f5b9195eeaa2a4e

查看 Django 模型将生成的内容

%> python manage.py sql hello # 示例输出。如果看起来可以……
%> python manage.py syncdb

Django 管理界面非常方便,值得设置。我将跳过细节,但为了让它工作,我做了这个:https://github.com/mdagosta/hello-sdj/commit/7e4744e7c92be1e3430a147b4965ae0b7172dd03

继续按照代码进行,并添加一些 url 和 view: https://github.com/mdagosta/hello-sdj/commit/a1882138363ff684c11b427a37a067a75166cff1

希望您正在进入编辑文件、运行应用程序并在浏览器中加载它的流程。我做到了,并相信 Git Commit 值得一千言万语,所以这里有三个提交,它们构建了基于 Web 的数据库电子邮件系统的所有功能

https://github.com/mdagosta/hello-sdj/commit/3e5b0c5a4fb4beb3e2e968ee1a0e9ecb35bc0fc7
https://github.com/mdagosta/hello-sdj/commit/866c88b3d51724f5e1a8177ce56d66565dc3e8bb
>https://github.com/mdagosta/hello-sdj/commit/b97230fbc08ea85c8c8730609f32c3befc097314

我希望您能成功,您的应用程序运行良好。如果您成功了,请给我发一封电子邮件,我将回复告知我收到了您的消息。不要害羞 :-)

Tornado 示例

对于 Tornado 示例,我将引导您完成 Tornado 的安装,以便您可以获得 Tornado 包附带的 webchat 演示。这些示例足以说明轮询和 Websocket 的实现,无需任何修改。第一个聊天演示需要 Google OAuth,所以如果您还不是 Google Borg,您将需要注册 Google 才能尝试。

首先从 github 克隆 tornado

%> git clone https://github.com/facebook/tornado.git
%> cd tornado
%> sudo python setup.py install

然后将 tornado/demos/chat 目录的内容复制到您的目录并运行它

%> cp -R tornado/demos/chat .
%> cd chat
%> ./chatdemo.py     # Ctrl-C 退出

使用两个单独的浏览器或配置文件,访问 https://:8888,并登录 Google。开箱即用,您应该能够键入消息,这些消息会出现在另一个浏览器中。

尝试使用 websockets 进行相同的操作。回到上一级目录,并将 tornado/demos/websocket 目录的内容复制到您的目录

%> cp -R tornado/demos/websocket .
%> cd websocket
%> ./chatdemo.py    # Ctrl-C 退出

您会在运行服务器的终端中看到一些内部的差异。但除此之外,您的消息应该会像原始聊天演示一样出现在两个浏览器中。

这些代码示例既简洁又密集。如果您有兴趣,秉承精益求精的精神,我敦促您仔细阅读它们。chat/chatdemo.py 有 160 行代码,websocket/chatdemo.py 有 106 行代码。所以,去吧,阅读并开始学习。特别注意 RequestHandler 类的设置方式,以及 @tornado.web.authenticated、@tornado.web.asynchronous、@gen.coroutine。在 websocket 演示中,还要注意 ChatSocketHandler 如何以 WebSocketHandler 作为其父类。如果您渴望构建一个实时系统,请尝试就地修改 ChatSocketHandler,看看能做到多远!

如何选择

要在 Django 和 Tornado 之间进行选择,您应该考虑您要构建的网站类型、您团队的技能水平和彼此之间的距离,以及您可以投入多少精力。Django 通常更适合初学者,因为它隐藏了许多细节,并且适合预算或有最后期限的项目。Tornado 通常允许更有经验的开发人员实现更大的愿景,尽管构建一些基础设施需要更多的努力。

如果您的团队是分布式的,Django 将提供更好的工具来管理模式和迁移数据,而 Tornado 没有内置任何此类工具。但是,如果您的团队彼此接近,您可以培养一种利用小型项目创造伟大成就的文化。

最后,如果您的应用程序需要轮询或 Web 套接字,或者在完成用户请求时需要发出 Web 请求,Tornado 的 IOLoop 将为您提供很多价值。异步系统存在风险,例如阻塞主线程,但当风险得到缓解时,异步系统可以带来比标准 fork Web 服务器更广泛的动态和交互式功能。如果您拥有一支在近距离工作的技术精湛的团队,您几乎肯定能够利用 Tornado 实现任何愿景。

摘要

如果您要从头开始一个新项目,我强烈推荐 Python。它是一种很棒的通用语言,具有足够的清晰度、速度和功能,您可以组建一个全球团队来构建高性能网站。您将需要选择一个适合您的团队和项目的 Web 框架,在 Django 和 Tornado 之间,您可以实现几乎任何目标。

3pack Python 编程

本文最初发表于 《Software Developer's Journal》2013 年 8 月刊。您可以在 SDJ 网站上找到更多文章。您还可以 在此处 购买三期专注于 Python 编程的《Software Developer’s Journal》和《Hackin9》杂志。通过 Python StarterKit 学习如何开始您在最受欢迎的编程语言之一的旅程。然后,通过 Python In a Few Lines of Codes 达到新的水平。完成后,尝试 Offensive Python,成为一名专业人士。  

© . All rights reserved.